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!

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:

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

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)+?+]}}

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


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


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.


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.


¡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

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)


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


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


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

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

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

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


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.


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!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.