Wydrukuj warstwowe ciasto

14

Wyzwanie

Biorąc pod uwagę dane wejściowe n, wydrukuj nwysokie warstwy ciasta artystycznego ASCII , oglądane z boku, z dwiema świecami na górze. Szczegółowe informacje znajdują się w poniższych przykładach.

Wynik

>> cake(1)

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

>> cake(3)

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

...i tak dalej.

Zasady

  • Standardowe luki zabronione
  • Spróbuj sprytnego rozwiązania
  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach. Jednak odpowiedź nie zostanie wybrana.

Baw się dobrze!

dkudriavtsev
źródło

Odpowiedzi:

6

Python 2, 238 znaków

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

Brakujący przykład Cake 2:

   _|_|_
  |     |
+---------+
|         |
+---------+
Edelbitter
źródło
Witam i witam na stronie! Możesz pobrać dane ze STDIN i zdjąć 24 znaki. Na przykładi=int(input())
James
Jeśli chcesz, powinieneś być w stanie przejść na Python 2 i zmienić int(input())na input()oraz printinstrukcję, a także możesz zmienić cztery spacje na jeden (jeśli jest to tabulator, zmień go na spację, aby było bardziej oczywiste, że to jedna postać) . Ponadto z jakiegoś powodu liczba bajtów jest o 4 za wysoka.
Tylko ASCII
@Mars Ultor ups, tak, nie jestem pewien, dlaczego wybrałem Python 3 na początek. Dzięki.
edelbitter
Możesz także być w stanie zapisać kilka bajtów przy użyciu formatowania procentowego
tylko ASCII,
4

Rubin, 109 107 bajtów

->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)+?+]}}
m-chrzan
źródło
3

Partia, 233 bajty

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

Krótszy niż Python? Coś musi być nie tak ...

Neil
źródło
3

JavaScript (ES6), 134 bajty

Ciasto rekurencyjne.

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)

Próbny

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

Arnauld
źródło
3

Haskell, 103 bajty

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

Definiuje funkcję, gktóra zwraca listę ciągów znaków zawierających linie wyniku

Dianne
źródło
2

05AB1E, 115 , 101 znaków

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

Zaoszczędź 14 znaków dzięki Adnan!
Zdecydowanie trochę miejsca na grę w golfa.

Wypróbuj online!

Zauważ, że spowoduje to wydrukowanie wszystkiego przesuniętego o jedną spację.

Łukasz
źródło
Witamy w Programowaniu zagadek i Code Golf! Bardzo ładna pierwsza odpowiedź :)
Adnan
1
Może pomnoży ciąg znaków, który jest ×poleceniem. To jest przykład użycia.
Adnan
@Adnan To pomaga! Dzięki!
Łukasza
2

Python 2, 122 bajty

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
Lynn
źródło
2

Python 3, 162 znaków

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)

Nie jest to zbyt mądre, ale nigdy wcześniej tego nie robiłem. (Edycja: usunięto niepotrzebne nawiasy; zmniejszono o jeszcze jedną postać)

Zoetrofia
źródło
Witamy na stronie i fajna pierwsza odpowiedź!
James
2

Pyth, 73 bajty

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

Program, który pobiera liczbę całkowitą na STDIN i wypisuje wynik.

Prawdopodobnie jest tu jeszcze trochę golfa.

Wypróbuj online

Wyjaśnienie nastąpi później

TheBikingViking
źródło
1

JavaScript (ES6), 171 bajtów

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

Pierwsze przejście, prawdopodobnie nie optymalne ...

ETHprodukcje
źródło
1

PHP, 150 147 138 136 136 130 140 bajtów

nowe podejście:

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

stara wersja w celach informacyjnych:

$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),"
";
Tytus
źródło
Jestem ciekawy; w jaki sposób odczyt ten jest wprowadzany?
Lynn,
@ Lynn: cholera, zapomniałem, że tym razem 10 bajtów narzutów $argv. : - /
Tytus
1

Vimscript, 116 115 bajtów

Całkiem niechlujny, ale działa!

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

Aby to nazwać: call A(3)w pustym miejscu buforze. Aby załadować funkcję,source cake.vim

Wyjaśnienie

  • 2i+<Esc>5i-<Esc> pisze pierwszą linię +-----+
  • o||<Esc>5i<Space><Esc>dodaje | |w drugiej linii
  • Vkyjply4lpjy4hpjest zapisany w makrze @z- wizualnie wybiera obie linie, szarpa je, wkleja pod nimi i dodaje do nich 4 myślniki i spacje.
  • #@zpowtarza się ten #czas
  • ddl4x usuwa ostatnie linie i usuwa kreski na dole ciasta, aby zrównał się z górną częścią dolnej warstwy
  • ggd$i_|_|_ zastępuje pierwszą linię na górze ciasta
  • %cenastępnie wyśrodkowuje całe ciasto do szerokości dolnej warstwy! !
Christian Rondeau
źródło
1

SOGL V0.12 , 27 26 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie:

∫               }           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
dzaima
źródło
0

Excel VBA, 139 130 127 bajtów

Anonimowe bezpośrednie okno VBE, które pobiera dane z komórki A1i wysyła ciasto do bezpośredniego okna 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"+
Taylor Scott
źródło
0

CJam, 79 bajtów

l~4*):Z5:X{D'+'-C}:A{D'|SC}:B{X*1$N}:C];{SZX-Y/*}:D~" _|_|_"NB{XZ<}{X4+:X;AB}wA

Wypróbuj online

Chiel ten Brinke
źródło
0

QBasic, 115 bajtów

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

Nie golfił

Wydrukuj górną linię ze świecami; następnie wydrukuj resztę ciasta po dwie linie na raz.

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, użyte w PRINTinstrukcji, emituje określoną liczbę spacji. Dogodnie, gdy podaje się argument ujemny, traktuje go jako 0, więc fakt, że indent - 2jest -2w ostatniej iteracji, nie stanowi problemu. STRING$pobiera liczbę i kod znaku (tutaj 45 dla -) i powtarza znak tyle razy. W tym przypadku musimy w specjalnym przypadku napisać ostatnią linię (kiedy i=n) o 4 łączniki krótsze niż w innym przypadku.

DLosc
źródło
0

C (gcc) , 158 153 bajtów

-5 bajtów dzięki pułapowi cat.

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);}

Wypróbuj online!

gastropner
źródło