Imprimer un gâteau en couches

14

Défi

Étant donné une entrée n, imprimez un gâteau d'art ASCII en ncouches hautes, vu de côté, avec deux bougies sur le dessus. Reportez-vous aux exemples ci-dessous pour plus de détails.

Production

>> cake(1)

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

>> cake(3)

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

...etc.

Règles

  • Failles standard interdites
  • Veuillez essayer une solution intelligente
  • C'est le , donc la réponse la plus courte en octets l'emporte. Cependant, la réponse ne sera pas sélectionnée.

S'amuser!

dkudriavtsev
la source

Réponses:

6

Python 2, 238 caractères

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'exemple manquant de Cake 2:

   _|_|_
  |     |
+---------+
|         |
+---------+
edelbitter
la source
Bonjour et bienvenue sur le site! Vous pouvez prendre l'entrée de STDIN et enlever 24 caractères. Par exemple,i=int(input())
James
Si vous le souhaitez, vous devriez pouvoir passer à Python 2 et changer int(input())à input()et à l' printinstruction, plus vous pouvez changer les quatre espaces en un (si c'est un onglet, changez-le en un espace pour rendre plus évident qu'il s'agit d'un seul caractère) . De plus, votre bytecount est 4 trop élevé pour une raison quelconque.
ASCII uniquement
@Mars Ultor oups, oui, je ne sais pas pourquoi j'ai choisi python 3 pour commencer. Merci.
edelbitter
Vous pouvez également être en mesure d'économiser quelques octets en utilisant le formatage en pourcentage
ASCII uniquement
4

Rubis, 109 107 octets

->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
la source
3

Lot, 233 octets

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

Plus court que Python? Quelque chose ne va pas ...

Neil
la source
3

JavaScript (ES6), 134 octets

Un gâteau récursif.

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)

Démo

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
la source
3

Haskell, 103 octets

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

Définit une fonction gqui renvoie une liste de chaînes contenant les lignes de la sortie

dianne
la source
2

05AB1E, 115 , 101 caractères

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

14 caractères sauvés grâce à Adnan!
Certainement un peu de place pour jouer au golf ici.

Essayez-le en ligne!

Notez que cela imprime tout décalé d'un espace.

Luc
la source
Bienvenue dans Programmation d'énigmes et Code Golf! Très belle première réponse :)
Adnan
1
Peut-être que la multiplication des chaînes aide, ce qui est la ×commande. Ceci est un exemple sur la façon dont il est utilisé.
Adnan
@Adnan Cela aide! Merci!
Luke
2

Python 2, 122 octets

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
la source
2

Python 3, 162 caractères

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)

Ce n'est pas très intelligent, mais je n'en ai jamais fait auparavant. (Édition: suppression des parenthèses inutiles; réduction d'un caractère de plus)

Zoétrophie
la source
Bienvenue sur le site et bonne première réponse!
James
2

Pyth, 73 octets

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

Un programme qui prend l'entrée d'un entier sur STDIN et imprime le résultat.

Il y a probablement encore du golf à faire ici.

Essayez-le en ligne

Explication à venir plus tard

TheBikingViking
la source
1

JavaScript (ES6), 171 octets

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

Premier passage, probablement pas optimal ...

ETHproductions
la source
1

PHP, 150 147 138 136 130 140 140 octets

nouvelle approche:

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

ancienne version pour référence:

$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
la source
Je suis curieux; comment cela lit-il l'entrée?
Lynn
@Lynn: putain j'ai oublié que cette fois 10 octets de surcharge pour $argv. : - /
Titus
1

Vimscript, 116 115 octets

Assez salissant mais ça marche!

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

Pour l'appeler: call A(3)dans un vide tampon . Pour charger la fonction,source cake.vim

Explication

  • 2i+<Esc>5i-<Esc> écrit la première ligne +-----+
  • o||<Esc>5i<Space><Esc>ajoute | |sur la deuxième ligne
  • Vkyjply4lpjy4hpest enregistré dans la macro @z- il sélectionne visuellement les deux lignes, les tire, les colle sous et leur ajoute 4 tirets et des espaces.
  • #@zrépète cette #fois
  • ddl4x supprime les dernières lignes et supprime les tirets au bas du gâteau pour le rendre égal au haut de la couche inférieure
  • ggd$i_|_|_ remplace la première ligne par le haut du gâteau
  • %cepuis centre le gâteau entier sur la largeur de la couche inférieure! !
Christian Rondeau
la source
1

SOGL V0.12 , 27 26 octets

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

Essayez-le ici!

Explication:

∫               }           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
la source
0

Excel VBA, 139 130 127 octets

Fenêtre immédiate VBE anonyme qui prend l'entrée de la cellule A1et sort un gâteau dans la fenêtre immédiate 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
la source
0

CJam, 79 octets

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

Essayez-le en ligne

Chiel ten Brinke
la source
0

QBasic, 115 octets

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

Non golfé

Imprimez la ligne supérieure avec les bougies; puis imprimez le reste du gâteau deux lignes à la fois.

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, lorsqu'il est utilisé dans une PRINTinstruction, émet le nombre donné d'espaces. De manière pratique, lorsqu'il reçoit un argument négatif, il le traite comme 0, donc le fait qu'il se indent - 2trouve -2dans la dernière itération n'est pas un problème. STRING$prend un compte et un code de caractère (ici, 45 pour -) et répète le caractère autant de fois. Ici, nous devons cas particulier que la dernière ligne (quand i=n) soit 4 traits d'union plus courte qu'elle ne le serait autrement.

DLosc
la source
0

C (gcc) , 158 octets

-5 octets grâce au plafond.

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

Essayez-le en ligne!

gastropner
la source