Imprimir um bolo em camadas


14

Desafio

Dada a entrada n, imprima uma ncamada de bolo de arte ASCII de altura, vista de lado, com duas velas em cima. Consulte os exemplos abaixo para obter detalhes.

Resultado

>> cake(1)

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

>> cake(3)

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

...e assim por diante.

Regras

  • Falhas padrão proibidas
  • Por favor, tente uma solução inteligente
  • Isso é , então a resposta mais curta em bytes vence. No entanto, a resposta não será selecionada.

Diverta-se!

Respostas:


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

O exemplo que faltava do Bolo 2:

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

Olá e bem-vindo ao site! Você pode receber informações do STDIN e tirar 24 caracteres. Por exemplo,i=int(input())
DJMcMayhem

Se você quiser, poderá mudar para Python 2 e mudar int(input())para input()e oprint instrução, além de alterar os quatro espaços para um (se for uma guia, altere-o para um espaço para tornar mais óbvio que é um caractere) . Além disso, seu número de bytes é 4 alto demais por algum motivo.
somente ASCII

@ Marte Ultor oops, sim, não sei por que escolhi o python 3 para começar. Obrigado.
Edelbitter 17/09/16

Você também pode salvar alguns bytes usando a porcentagem de formatação
somente ASCII

4

Ruby, 109 107 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%+

Mais curto que Python? Algo deve estar errado ...


3

JavaScript (ES6), 134 bytes

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

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 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 uma função gque retorna uma lista de cadeias contendo as linhas da saída


2

05AB1E, 115 , 101 caracteres

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

Guardado 14 caracteres graças a Adnan!
Definitivamente algum espaço para jogar golfe aqui.

Experimente online!

Observe que isso imprime tudo deslocado por um espaço.


Bem-vindo à Programação de Puzzles e Code Golf! Very nice primeira resposta :)
Adnan

1
Talvez a multiplicação de cadeias ajude, que é o ×comando.Este é um exemplo de como é usado.
Adnan

@ Adnan Isso ajuda! Obrigado!
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)

Não é muito inteligente, mas nunca fiz um desses antes. (Editar: removido parênteses desnecessários; reduzido em mais um caractere)


Bem-vindo ao site, e boa primeira resposta!
DJMcMayhem

2

Pitão, 73 bytes

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

Um programa que recebe a entrada de um número inteiro em STDIN e imprime o resultado.

Provavelmente ainda há golfe a ser feito aqui.

Experimente online

Explicação que vem depois


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

Primeira passagem, provavelmente não ideal ...


1

PHP, 150 147 138 136 130 140 bytes

nova abordagem:

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

versão antiga para referência:

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

Estou curioso; como isso lê a entrada?
Lynn

@ Lynn: caramba, eu esqueci que desta vez. 10 bytes de sobrecarga para $argv. : - /
Titus

1

Vimscript, 116 115 bytes

Muito bagunçado, mas 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 chamá-lo: call A(3)em um buffer vazio . Para carregar a função,source cake.vim

Explicação

  • 2i+<Esc>5i-<Esc> escreve a primeira linha +-----+
  • o||<Esc>5i<Space><Esc>adiciona | |na segunda linha
  • Vkyjply4lpjy4hp é salvo na macro @z - seleciona visualmente as duas linhas, as puxa, as cola em baixo e adiciona 4 traços e espaços a elas.
  • #@z repete isso # tempo
  • ddl4x exclui as últimas linhas e remova os traços para o fundo do bolo para torná-lo igual ao topo da camada inferior
  • ggd$i_|_|_ substitui a primeira linha pela parte superior do bolo
  • %ceentão centraliza o bolo inteiro na largura da camada inferior! !

1

SOGL V0.12 , 27 26 bytes

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

Experimente aqui!

Explicação:

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

Janela imediata VBE anônima que recebe a entrada da célula A1e envia um bolo para a janela imediata 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

Ungolfed

Imprima a linha superior com as velas; depois imprima o restante do bolo duas linhas por 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, quando usado em uma PRINTinstrução, emite o número especificado de espaços. Convenientemente, quando recebe um argumento negativo, ele o trata como 0; portanto, o fato de indent - 2estar -2na última iteração não é um problema. STRING$pega uma contagem e um código de caractere (aqui, 45 para -) e repete o caractere esse número de vezes. Aqui, temos que especificar um caso especial para a última linha (quando i=n) ser 4 hífens mais curta do que seria.


0

C (gcc) , 158 153 bytes

-5 bytes graças ao 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);}

Experimente online!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.