พิมพ์เค้กชั้น


14

ท้าทาย

รับอินพุตnพิมพ์เค้กnเลเยอร์ASCII สูงมองจากด้านข้างโดยมีเทียนสองอันอยู่ด้านบน ดูตัวอย่างด้านล่างสำหรับรายละเอียด

เอาท์พุต

>> cake(1)

 _|_|_
|     |
+-----+

>> cake(3)

     _|_|_
    |     |
  +---------+
  |         |
+-------------+
|             |
+-------------+

... และต่อไป

กฎระเบียบ

  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • โปรดลองวิธีแก้ปัญหาที่ฉลาด
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ อย่างไรก็ตามคำตอบจะไม่ถูกเลือก

มีความสุข!

คำตอบ:


6

Python 2, 238 ตัวอักษร

i=input()
m=["+"+"-"*(i*4+1)+"+","|"+" "*(i*4+1)+"|"]
for v in range(i,1,-1):
 m+=[" "*(i-v)*2+"+"+"-"*(v*4+1)+"+"," "*(i-v+1)*2+"|"+" "*((v-1)*4+1)+"|"]
m.pop()
m+=[" "*(i-1)*2+"|"+" "*5+"|"," "*(i-1)*2+" _|_|_"]
print'\n'.join(m[::-1])

ตัวอย่างที่ขาดหายไปของ Cake 2:

   _|_|_
  |     |
+---------+
|         |
+---------+

สวัสดีและยินดีต้อนรับสู่เว็บไซต์! คุณสามารถรับอินพุตจาก STDIN และถอดออกได้ 24 ตัวอักษร ตัวอย่างเช่นi=int(input())
James

หากคุณต้องการคุณควรจะเปลี่ยนเป็น Python 2 และเปลี่ยนint(input())เป็นinput()และprintคำสั่งรวมทั้งคุณสามารถเปลี่ยนสี่ช่องว่างเป็นหนึ่ง (ถ้าเป็นแท็บเปลี่ยนเป็นช่องว่างเพื่อให้เห็นได้ชัดเจนว่าเป็นอักขระหนึ่งตัว) . บวก bytecount ของคุณคือ 4 สูงเกินไปด้วยเหตุผลบางอย่าง
ASCII เท่านั้นเท่านั้น

@Mars Ultor oops ใช่ฉันไม่แน่ใจว่าทำไมฉันถึงเลือก python 3 เพื่อเริ่มต้น ขอบคุณ
edelbitter

คุณอาจบันทึกสองสามไบต์โดยใช้การจัดรูปแบบเปอร์เซ็นต์
เพียง ASCII เท่านั้น


3

รุ่นที่ 233 ไบต์

@echo off
set i=
for /l %%j in (2,1,%1)do call set i=  %%i%%
echo %i% _^|_^|_
set s=-----
for /l %%j in (2,1,%1)do call:l
echo ^|%s:-= %^|
echo +%s%+
exit/b
:l
echo %i%^|%s:-= %^|
set i=%i:~2%
set s=----%s%
echo %i%+%s%+

สั้นกว่า Python หรือไม่? มีบางอย่างผิดปกติ ...


3

JavaScript (ES6), 134 ไบต์

เค้กแบบเรียกซ้ำ

f=(n,i=--n,r=(n,c)=>'- '[+!c].repeat(n),p=r((i-n)*2),j=n*4+5,x=p+`+${r(j,1)}+
`)=>(n?f(n-1,i)+x:p+` _|_|_
`)+p+`|${r(j)}|
`+(n-i?'':x)

การสาธิต

let f=(n,i=--n,r=(n,c)=>'- '[+!c].repeat(n),p=r((i-n)*2),j=n*4+5,x=p+`+${r(j,1)}+
`)=>(n?f(n-1,i)+x:p+` _|_|_
`)+p+`|${r(j)}|
`+(n-i?'':x)

console.log(f(4))


3

Haskell, 103 ไบต์

f(a:b)n=a:([0..4*n]>>b)++[a]
x!n=x:[f"| "n,f"+-"n]
g 1=" _|_|_"!1
g n=map("  "++)(init.g$n-1)++f"+-"n!n

กำหนดฟังก์ชั่นgซึ่งจะส่งกลับรายการของสตริงที่มีบรรทัดของเอาต์พุต


2

05AB1E, 115 , 101 ตัวอักษร

>UXð×?" _|_|_",Xð×?"|     |",X<U0<VXGNVXY-ð×?'+?8Y·+G'-?}'+,XY-ð×?'|?7Y·+ð×?'|,}XY-ð×?'+?8Y·+G'-?}'+,

บันทึก 14 ตัวอักษรขอบคุณ Adnan!
มีห้องสำหรับเล่นกอล์ฟที่นี่อย่างแน่นอน

ลองออนไลน์!

โปรดทราบว่านี่จะพิมพ์ทุกอย่างตรงข้ามด้วยที่ว่างเดียว


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! คำตอบแรกที่ดีมาก :)
Adnan

1
บางทีการคูณสตริงช่วยซึ่งเป็น×คำสั่ง นี่คือตัวอย่างการใช้งาน
Adnan

@Adnan นั่นช่วยได้! ขอบคุณ!
ลุค


2

Python 3, 162 ตัวอักษร

p=print
t=int(input())
d=4*'-'
s='  '
a='+\n'
r=(t-1)*s
p(r+' _|_|_\n'+r+'|     |')
for i in range(2,t+1):b=(t-i)*s;p(b+'+-'+i*d+a+b+'| '+i*2*s+'|')
p('+-'+t*d+a)

มันไม่ฉลาดมาก แต่ฉันไม่เคยทำแบบนี้มาก่อน (แก้ไข: ลบวงเล็บที่ไม่จำเป็นออกโดยลดอีกหนึ่งอักขระ)


ยินดีต้อนรับสู่เว็บไซต์และคำตอบแรกที่ดี!
James

2

Pyth, 73 ไบต์

+K*dtyQ"_|_|_"+tK"|     |"jP.iJms[*\ yt-Qd\+*+5*4d\-\+)+StQtQmXd"+-""| "J

โปรแกรมที่รับอินพุตของจำนวนเต็มบน STDIN และพิมพ์ผลลัพธ์

อาจยังมีบางกอล์ฟที่ต้องทำที่นี่

ลองออนไลน์

คำอธิบายมาในภายหลัง


1

JavaScript (ES6), 171 ไบต์

n=>[(s="  "[R='repeat'](n-1))+" _|_|_",s+"|     |",...Array(n-1),`+${"-"[R](n*4+1)}+`].map((_,i)=>_||(s="  "[R](n-i))+`+${"-"[R](i=i*4+1)}+`+`
${s}|${" "[R](i)}|`).join`
`

รอบแรกอาจไม่ดีที่สุด ...


1

PHP, 150 147 138 136 130 140 ไบต์

วิธีการใหม่:

echo$p=str_pad("",-2+2*$n=$argv[1])," _|_|_";for($x="    ",$b=$y="----";$n--;){$a.=$x;if($n)$b.=$y;echo"
$p| $a|
",$p=substr($p,2),"+-$b+";}

รุ่นเก่าสำหรับการอ้างอิง:

$p=str_pad;for($o=["_|_|_"];$i++<$n=$argv[1];$o[]="+".$p("",($i<$n)*4+$e,"-")."+")$o[]="|".$p("",$e=$i*4+1)."|";foreach($o as$s)echo$p($s,$n*4+3," ",2),"
";

ฉันอยากรู้; อินพุตการอ่านนี้เป็นอย่างไร
ลินน์

@Lynn: ประณามฉันลืมไปว่า time.10 $argvนี้ไบต์สำหรับค่าใช้จ่าย : - /
ติตัส

1

Vimscript, 116 115 ไบต์

สวยยุ่ง แต่ใช้งานได้!

fu A(n)
let @z="Vkyjply4lpjy4hp"
exe "norm 2i+\e5i-\eo||\e5i \e".a:n."@zddl4xggd$i_|_|_"
exe "%ce ".(a:n*4+3)
endfu

วิธีโทร: call A(3)ในที่ว่างบัฟเฟอร์ในการโหลดฟังก์ชันsource cake.vim

คำอธิบาย

  • 2i+<Esc>5i-<Esc> เขียนบรรทัดแรก +-----+
  • o||<Esc>5i<Space><Esc>เพิ่ม| |ในบรรทัดที่สอง
  • Vkyjply4lpjy4hpจะถูกบันทึกไว้ในมาโคร@zโดยจะเลือกทั้งสองเส้นดึงข้อมูลวางลงใต้ภาพและเพิ่มขีดคั่นและช่องว่าง 4 รายการ
  • #@zทำซ้ำ#ครั้งนี้
  • ddl4x ลบบรรทัดสุดท้ายและลบเครื่องหมายขีดคั่นที่ด้านล่างของเค้กเพื่อให้เท่ากับด้านบนของเลเยอร์ด้านล่าง
  • ggd$i_|_|_ แทนที่บรรทัดแรกด้วยด้านบนของเค้ก
  • %ceจากนั้นจัดวางเค้กทั้งหมดให้อยู่ที่ความกว้างของชั้นล่าง! !

1

SOGL V0.12 , 27 26 ไบต์

∫4*I:┌*╗1Ο;@*┐1Ο}⁴¹k┐╔2ΟΚ╚

ลองที่นี่!

คำอธิบาย:

∫               }           for each in 1..input inclusive, pushing counter
 4*                           multiply by 4
   I                          increase by 1
    :                         duplicate; this will be used later
     ┌*                       repeat a dash pop times
       ╗1Ο                    encase them in plusses
          ;                   get the duplicate on the stacks top
           @*                 repeat a space pop times
             ┐1Ο              encase in vertical bars
                 ⁴          duplicate the item below ToS - the last line
                  ¹         wrap the stack in an array
                   k        remove the arrays first item
                    ┐       push "_"
                     ╔      push "|"
                      2Ο    encase 2 copies of the vertical bar in underscores
                        Κ   and prepend that to the array
                         ╚  center the array horizontally

0

Excel VBA, 139 130 127 ไบต์

หน้าต่าง VBE แบบไม่ระบุชื่อทันทีที่รับอินพุตจากเซลล์A1และส่งเค้กไปที่หน้าต่าง VBE ทันที

For i=1To[A1]:s=Space(2*([A1]-i)):x=String(1+4*i,45):?s &IIf(i=1," _|_|_","+" &x &"+"):?s"|"Replace(x,"-"," ")"|":Next:?s"+"x"+


0

QBasic ขนาด 115 ไบต์

INPUT n
?SPC(n*2-1)"_|_|_
FOR i=1TO n
s=n*2-i*2
?SPC(s)"|"SPC(i*4+1)"|
?SPC(s-2)"+"STRING$(i*4+(i=n)*4+5,45)"+
NEXT

Ungolfed

พิมพ์บรรทัดบนสุดด้วยเทียน; จากนั้นพิมพ์เค้กที่เหลือสองบรรทัดต่อครั้ง

INPUT n
PRINT SPC(n * 2 - 1); "_|_|_"
FOR i = 1 TO n
  indent = n * 2 - i * 2
  PRINT SPC(indent); "|"; SPC(i * 4 + 1); "|"
  PRINT SPC(indent - 2); "+"; STRING$(i * 4 + (i = n) * 4 + 5, 45); "+"
NEXT

SPCเมื่อใช้ในPRINTคำสั่งปล่อยจำนวนช่องว่างที่กำหนด สะดวกสบายเมื่อได้รับข้อโต้แย้งเชิงลบมันจะถือว่าเป็น 0 ดังนั้นความจริงที่indent - 2อยู่-2ในการทำซ้ำครั้งสุดท้ายไม่ได้เป็นปัญหา STRING$ใช้เวลาในการนับและรหัสตัวอักษร (ที่นี่ 45 สำหรับ-) และทำซ้ำตัวละครที่จำนวนครั้ง ที่นี่เราจะต้องเป็นกรณีพิเศษบรรทัดสุดท้าย (เมื่อi=n) เพื่อให้เป็น 4 ยัติภังค์ที่สั้นกว่ามันจะเป็นอย่างอื่น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.