Cetak kue berlapis


14

Tantangan

Diberikan input n, cetak kue seni ASCII nlapisan tinggi, dilihat dari samping, dengan dua lilin di atasnya. Lihat contoh di bawah untuk detailnya.

Keluaran

>> cake(1)

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

>> cake(3)

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

...dan seterusnya.

Aturan

  • Celah standar dilarang
  • Silakan coba solusi cerdas
  • Ini adalah , jadi jawaban tersingkat dalam byte menang. Namun, jawabannya tidak akan dipilih.

Selamat bersenang-senang!

Jawaban:


6

Python 2, 238 karakter

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])

Contoh Cake 2 yang hilang:

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

Halo, dan selamat datang di situs ini! Anda bisa mengambil input dari STDIN dan melepas 24 karakter. Misalnya,i=int(input())
DJMcMayhem

Jika Anda ingin, Anda harus bisa mengubah ke Python 2 dan mengubah int(input())ke input()dan printpernyataan, ditambah Anda dapat mengubah empat spasi menjadi satu (jika itu tab, ubah ke spasi untuk membuatnya lebih jelas bahwa itu adalah satu karakter) . Plus bytecount Anda terlalu tinggi untuk beberapa alasan.
ASCII

@Mars Ultor oops, ya, saya tidak yakin mengapa saya memilih python 3 untuk memulai. Terima kasih.
edelbitter

Anda juga dapat menyimpan beberapa byte menggunakan format persen
ASCII

4

Ruby, 109 107 byte

->n{p=->t{puts t.center 3+4*n}
p['_|_|_']
(1..n).map{|i|p[?|+' '*(1+4*i)+?|]
p[?++?-*((i<n ?5:1)+4*i)+?+]}}

3

Batch, 233 byte

@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%+

Lebih pendek dari Python? Pasti ada yang salah ...


3

JavaScript (ES6), 134 byte

Kue rekursif.

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)

Demo

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 byte

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

Menentukan fungsi gyang mengembalikan daftar string yang berisi garis-garis output


2

05AB1E, 115 , 101 karakter

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

Menyimpan 14 karakter berkat Adnan!
Pasti ada ruang untuk bermain golf di sini.

Cobalah online!

Perhatikan bahwa ini akan mencetak semuanya dengan satu ruang.


Selamat Datang di Programming Puzzles dan Code Golf! Jawaban pertama yang sangat bagus :)
Adnan

1
Mungkin perkalian string membantu, yang merupakan ×perintah. Ini adalah contoh cara penggunaannya.
Adnan

@ Adnan Itu memang membantu! Terima kasih!
Luke

2

Python 2, 122 byte

a='  '*input()
b='+-+'
c=d=' '
while a:b='+----'+b[1:];c=d*4+c;a=a[2:];print a+[' _|_|_',b][c>d*5]+'\n%s|%%s|'%a%c
print b

2

Python 3, 162 karakter

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)

Ini tidak terlalu pintar, tetapi saya belum pernah melakukan ini sebelumnya. (Edit: menghapus tanda kurung yang tidak perlu; dikurangi satu karakter lagi)


Selamat datang di situs ini, dan jawaban pertama yang bagus!
DJMcMayhem

2

Pyth, 73 byte

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

Program yang mengambil input bilangan bulat pada STDIN dan mencetak hasilnya.

Mungkin masih ada beberapa golf yang harus dilakukan di sini.

Cobalah online

Penjelasan datang nanti


1

JavaScript (ES6), 171 byte

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`
`

Pass pertama, mungkin tidak optimal ...


1

PHP, 150 147 138 136 130 140 byte

pendekatan baru:

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+";}

versi lama untuk referensi:

$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),"
";

Saya penasaran; bagaimana ini membaca input?
Lynn

@ Lynn: sial aku lupa bahwa overhead time.10 byte ini untuk $argv. : - /
Titus

1

Vimscript, 116 115 byte

Cukup berantakan tapi berhasil!

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

Untuk menyebutnya: call A(3)di buffer kosong . Untuk memuat fungsi,source cake.vim

Penjelasan

  • 2i+<Esc>5i-<Esc> menulis baris pertama +-----+
  • o||<Esc>5i<Space><Esc>menambahkan | |pada baris kedua
  • Vkyjply4lpjy4hp disimpan di makro @z - secara visual memilih kedua garis, menariknya, menempelnya di bawah dan menambahkan 4 garis dan spasi untuknya.
  • #@z mengulangi ini # kali
  • ddl4x menghapus baris terakhir dan menghapus untuk tanda hubung ke bagian bawah kue untuk membuatnya sama dengan bagian atas lapisan bawah
  • ggd$i_|_|_ mengganti baris pertama dengan bagian atas kue
  • %celalu pusatkan seluruh kue ke lebar lapisan bawah! !

1

SOGL V0.12 , 27 26 byte

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

Coba Di Sini!

Penjelasan:

∫               }           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 Bytes

Jendela langsung VBE anonim yang mengambil input dari sel A1dan menampilkan kue ke jendela langsung 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 byte

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

Tidak disatukan

Cetak baris teratas dengan lilin; lalu cetak sisa kue dua baris sekaligus.

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, ketika digunakan dalam sebuah PRINTpernyataan, memancarkan jumlah spasi yang diberikan. Mudah, ketika diberi argumen negatif, itu memperlakukannya sebagai 0, jadi fakta yang indent - 2ada -2di iterasi terakhir bukan masalah. STRING$mengambil hitungan dan kode karakter (di sini, 45 untuk -) dan mengulangi karakter itu beberapa kali. Di sini, kita harus membuat case-case baris terakhir (kapan i=n) menjadi 4 hyphen lebih pendek dari yang seharusnya.


0

C (gcc) , 158 153 byte

-5 bytes berkat ceilingcat.

i,l,s;p(c,s){printf("%*c%*.*s%c\n",i-~i,c,l,l,s,c);}f(n){s=memset(malloc(5*n),45,5*n);l=1;for(i=n;i--;p('|',""))l+=4,n+~i?p(43,s):p(32,"_|_|_");p(43,s);}

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.