Imprime un pastel en capas

14

Desafío

Dada una entrada n, imprima un pastel de arte ASCII ncapas de altura, visto desde el lado, con dos velas en la parte superior. Consulte los ejemplos a continuación para obtener más detalles.

Salida

>> cake(1)

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

>> cake(3)

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

...y así.

Reglas

  • Lagunas estándar prohibidas
  • Por favor, intente una solución inteligente
  • Este es el , por lo que la respuesta más corta en bytes gana. Sin embargo, la respuesta no será seleccionada.

¡Que te diviertas!

dkudriavtsev
fuente

Respuestas:

6

Python 2, 238 caracteres

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

El ejemplo que falta de Cake 2:

   _|_|_
  |     |
+---------+
|         |
+---------+
edelbitter
fuente
Hola y bienvenidos al sitio! Puede tomar la entrada de STDIN y quitar 24 caracteres. Por ejemplo,i=int(input())
DJMcMayhem
Si lo desea, debe poder cambiar a Python 2 y cambiar int(input())a input()y la printdeclaración, además puede cambiar los cuatro espacios a uno (si es una pestaña, cámbielo a un espacio para que sea más obvio que es un personaje) . Además, su bytecount es 4 demasiado alto por alguna razón.
Solo ASCII
@Mars Ultor oops, sí, no estoy seguro de por qué elegí Python 3 para empezar. Gracias.
edelbitter
También puede guardar algunos bytes usando el formato de porcentaje
solo ASCII
4

Ruby, 109107 bytes

->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
fuente
3

Lote, 233 bytes

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

¿Más corto que Python? Algo debe estar mal ...

Neil
fuente
3

JavaScript (ES6), 134 bytes

Un pastel recursivo.

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)

Manifestación

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
fuente
3

Haskell, 103 bytes

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

Define una función gque devuelve una lista de cadenas que contienen las líneas de la salida.

dianne
fuente
2

05AB1E, 115 , 101 caracteres

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

¡Ahorre 14 caracteres gracias a Adnan!
Definitivamente hay espacio para jugar al golf aquí.

Pruébalo en línea!

Tenga en cuenta que esto imprime todo desplazado por un espacio.

Luke
fuente
¡Bienvenido a Programming Puzzles y Code Golf! Muy buena primera respuesta :)
Adnan
1
Tal vez la multiplicación de cadenas ayude, que es el ×comando. Este es un ejemplo de cómo se usa.
Adnan
@Adnan ¡Eso sí ayuda! ¡Gracias!
Lucas
2

Python 2, 122 bytes

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
fuente
2

Python 3, 162 caracteres

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)

No es muy inteligente, pero nunca he hecho uno de estos antes. (Editar: eliminó paréntesis innecesarios; reducido en un carácter más)

Zoetrofia
fuente
Bienvenido al sitio, y buena primera respuesta!
DJMcMayhem
2

Pyth, 73 bytes

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

Un programa que toma la entrada de un número entero en STDIN e imprime el resultado.

Probablemente todavía hay algo de golf por hacer aquí.

Pruébalo en línea

Explicación después

TheBikingViking
fuente
1

JavaScript (ES6), 171 bytes

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

Primer pase, probablemente no óptimo ...

ETHproductions
fuente
1

PHP, 150 147 138 136 130 140 bytes

nuevo enfoque:

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ón anterior para referencia:

$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),"
";
Titus
fuente
Soy curioso; ¿Cómo se lee esta entrada?
Lynn
@ Lynn: maldición, olvidé que esta vez, 10 bytes de sobrecarga para $argv. : - /
Titus
1

Vimscript, 116 115 bytes

Bastante desordenado pero funciona!

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

Para llamarlo: call A(3)en un búfer vacío . Para cargar la función,source cake.vim

Explicación

  • 2i+<Esc>5i-<Esc> escribe la primera línea +-----+
  • o||<Esc>5i<Space><Esc> agrega | | en la segunda línea
  • Vkyjply4lpjy4hp se guarda en la macro @z : selecciona visualmente ambas líneas, las tira, las pega debajo y les agrega 4 guiones y espacios.
  • #@z repite esto # vez
  • ddl4x elimina las últimas líneas y elimina los guiones en la parte inferior del pastel para que sea igual a la parte superior de la capa inferior
  • ggd$i_|_|_ reemplaza la primera línea por la parte superior del pastel
  • %ce¡luego centra todo el pastel al ancho de la capa inferior! !
Christian Rondeau
fuente
1

SOGL V0.12 , 27 26 bytes

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

Pruébalo aquí!

Explicación:

∫               }           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
fuente
0

Excel VBA, 139 130 127 Bytes

Ventana inmediata anónima de VBE que toma la entrada de la celda A1y genera un pastel a la ventana inmediata de 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
fuente
0

CJam, 79 bytes

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

Pruébalo en línea

Chiel ten Brinke
fuente
0

QBasic, 115 bytes

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

Sin golf

Imprime la línea superior con las velas; luego imprima el resto del pastel dos líneas a la vez.

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, cuando se usa en una PRINTdeclaración, emite el número dado de espacios. Convenientemente, cuando se le da un argumento negativo, lo trata como 0, por lo que el hecho de que indent - 2esté -2en la última iteración no es un problema. STRING$toma un recuento y un código de carácter (aquí, 45 para -) y repite el carácter esa cantidad de veces. Aquí, tenemos que poner en mayúsculas y minúsculas la última línea (cuándo i=n) para que sea 4 guiones más cortos de lo que sería de otra manera.

DLosc
fuente
0

C (gcc) , 158153 bytes

-5 bytes gracias 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);}

Pruébalo en línea!

gastropner
fuente