Stampa una torta a strati


14

Sfida

Dato un input n, stampa uno nstrato di torta di arte ASCII alto, visto di lato, con due candele in cima. Fare riferimento agli esempi seguenti per i dettagli.

Produzione

>> cake(1)

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

>> cake(3)

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

...e così via.

Regole

  • Scappatoie standard vietate
  • Si prega di provare una soluzione intelligente
  • Questo è , quindi vince la risposta più breve in byte. Tuttavia, la risposta non verrà selezionata.

Divertiti!

Risposte:


6

Python 2, 238 caratteri

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

L'esempio mancante di Cake 2:

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

Ciao e benvenuto nel sito! Puoi prendere input da STDIN e togliere 24 caratteri. Ad esempio,i=int(input())
James,

Se vuoi, dovresti essere in grado di passare a Python 2 e cambiare int(input())in input()e l' printistruzione, inoltre puoi cambiare i quattro spazi in uno (se è una scheda, cambiarlo in uno spazio per renderlo più ovvio che si tratta di un carattere) . Inoltre il tuo byte è 4 troppo alto per qualche motivo.
ASCII il

@Mars Ultor oops, sì, non sono sicuro del motivo per cui ho scelto Python 3 per cominciare. Grazie.
edelbitter,

Potresti anche essere in grado di salvare alcuni byte usando la formattazione percentuale
solo ASCII il

4

Rubino, 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

Lotto, 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%+

Più corto di Python? Qualcosa deve essere sbagliato ...


3

JavaScript (ES6), 134 byte

Una torta ricorsiva.

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)

dimostrazione

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

Definisce una funzione gche restituisce un elenco di stringhe contenenti le righe dell'output


2

05AB1E, 115 , 101 caratteri

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

Hai salvato 14 caratteri grazie ad Adnan!
Sicuramente un po 'di spazio per giocare a golf qui.

Provalo online!

Si noti che ciò stampa tutto offset di uno spazio.


Benvenuto in Puzzle di programmazione e Code Golf! Molto bella prima risposta :)
Adnan,

1
Forse la moltiplicazione delle stringhe aiuta, che è il ×comando. Questo è un esempio di come viene utilizzato.
Adnan,

@Adnan Questo aiuta! Grazie!
Luca,

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 caratteri

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)

Non è molto intelligente, ma non ho mai fatto uno di questi prima. (Modifica: rimosse parentesi non necessarie; ridotte di un altro carattere)


Benvenuti nel sito e bella prima risposta!
James,

2

Pyth, 73 byte

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

Un programma che accetta l'input di un numero intero su STDIN e stampa il risultato.

Probabilmente c'è ancora del golf da fare qui.

Provalo online

Spiegazione in arrivo


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

Primo passaggio, probabilmente non ottimale ...


1

PHP, 150 147 138 136 130 140 byte

nuovo approccio:

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

vecchia versione di riferimento:

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

Sono curioso; come viene letto questo input?
Lynn,

@Lynn: accidenti ho dimenticato che questa volta 10 byte in testa per $argv. : - /
Tito,

1

Vimscript, 116 115 byte

Abbastanza disordinato ma funziona!

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

Per chiamarlo: call A(3)in un buffer vuoto . Per caricare la funzione,source cake.vim

Spiegazione

  • 2i+<Esc>5i-<Esc> scrive la prima riga +-----+
  • o||<Esc>5i<Space><Esc>aggiunge | |sulla seconda riga
  • Vkyjply4lpjy4hpviene salvato nella macro @z: seleziona visivamente entrambe le linee, le strappa, le incolla e aggiunge 4 trattini e spazi.
  • #@zripete questa #volta
  • ddl4x elimina le ultime righe e rimuove i trattini nella parte inferiore della torta per renderla uguale alla parte superiore dello strato inferiore
  • ggd$i_|_|_ sostituisce la prima riga con la parte superiore della torta
  • %cequindi centra l'intera torta sulla larghezza dello strato inferiore! !

1

SOGL V0.12 , 27 26 byte

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

Provalo qui!

Spiegazione:

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

Finestra immediata VBE anonima che accetta input dalla cella A1e genera una torta nella finestra immediata 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

Ungolfed

Stampa la riga superiore con le candele; quindi stampa il resto della torta due righe alla volta.

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, se utilizzato in PRINTun'istruzione, emette il numero specificato di spazi. Convenientemente, quando viene dato un argomento negativo, lo tratta come 0, quindi il fatto che si indent - 2trova -2nell'ultima iterazione non è un problema. STRING$prende un conteggio e un codice carattere (qui, 45 per -) e ripete il carattere quel numero di volte. Qui, nel caso speciale, l'ultima riga (quando i=n) deve essere di 4 trattini più corta di quanto sarebbe altrimenti.


0

C (gcc) , 158 153 byte

-5 byte grazie a 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);}

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.