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!

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:

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

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

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


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


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


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.


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

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)


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


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


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

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

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

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


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.


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!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.