Drucken Sie einen Schichtkuchen


14

Herausforderung

Bei einer Eingabe ndrucken Sie einen ASCII- nKunstkuchen, der von der Seite betrachtet hoch ist und zwei Kerzen darauf enthält. Einzelheiten finden Sie in den folgenden Beispielen.

Ausgabe

>> cake(1)

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

>> cake(3)

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

...und so weiter.

Regeln

  • Standardlücken verboten
  • Bitte versuchen Sie eine clevere Lösung
  • Das ist , also gewinnt die kürzeste Antwort in Bytes. Die Antwort wird jedoch nicht ausgewählt.

Habe Spaß!

Antworten:


6

Python 2, 238 Zeichen

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

Das fehlende Beispiel von Kuchen 2:

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

Hallo und willkommen auf der Seite! Sie könnten Eingaben von STDIN nehmen und 24 Zeichen entfernen. Zum Beispieli=int(input())
DJMcMayhem

Wenn Sie möchten, sollten Sie in der Lage sein, zu Python 2 und int(input())zu input()und der printAnweisung zu wechseln. Außerdem können Sie die vier Leerzeichen in eins ändern. . Außerdem ist Ihr bytecount 4 aus irgendeinem Grund zu hoch.
Nur ASCII

@Mars Ultor Hoppla, ich bin mir nicht sicher, warum ich mich für Python 3 entschieden habe. Vielen Dank.
Edelbitter

Möglicherweise können Sie auch einige Bytes mit Prozentformatierung speichern
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

Batch, 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%+

Kürzer als Python? Irgendwas muss falsch sein ...


3

JavaScript (ES6), 134 Byte

Ein rekursiver Kuchen.

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

Definiert eine Funktion, gdie eine Liste von Zeichenfolgen zurückgibt, die die Zeilen der Ausgabe enthalten


2

05AB1E, 115 , 101 Zeichen

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

Dank Adnan 14 Zeichen gespart!
Auf jeden Fall etwas Platz zum Golfen hier.

Probieren Sie es online!

Beachten Sie, dass dies alles um ein Leerzeichen versetzt druckt.


Willkommen bei Programming Puzzles und Code Golf! Sehr schöne erste Antwort :)
Adnan

1
Vielleicht hilft die String-Multiplikation, was der ×Befehl ist. Dies ist ein Beispiel für die Verwendung.
Adnan

@Adnan Das hilft! Vielen Dank!
Luke

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 Zeichen

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)

Es ist nicht sehr klug, aber ich habe noch nie eines davon gemacht. (Bearbeiten: unnötige Klammern entfernt; um ein weiteres Zeichen reduziert)


Willkommen auf der Seite und schöne erste Antwort!
DJMcMayhem

2

Pyth, 73 Bytes

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

Ein Programm, das eine Ganzzahl in STDIN eingibt und das Ergebnis ausgibt.

Hier gibt es wahrscheinlich noch einiges zu golfen.

Probieren Sie es online aus

Erklärung kommt später


1

JavaScript (ES6), 171 Byte

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

Erster Durchgang, wahrscheinlich nicht optimal ...


1

PHP, 150 147 138 136 130 140 Bytes

neuer Ansatz:

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

alte Version als Referenz:

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

Ich bin neugierig; Wie liest diese Eingabe?
Lynn

@Lynn: verdammt ich habe vergessen, dass diesmal 10 Bytes Overhead für $argv. : - /
Titus

1

Vimscript, 116 115 Bytes

Ziemlich chaotisch, aber es funktioniert!

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

Um es zu nennen: call A(3)in einem leeren Puffer. Um die Funktion zu laden,source cake.vim

Erläuterung

  • 2i+<Esc>5i-<Esc> schreibt die erste Zeile +-----+
  • o||<Esc>5i<Space><Esc> fügt hinzu | | in der zweiten Zeile hinzu
  • Vkyjply4lpjy4hp wird im Makro gespeichert @z - es wählt beide Linien visuell aus, zieht sie an, fügt sie darunter ein und fügt ihnen 4 Bindestriche und Leerzeichen hinzu.
  • #@z wiederholt dies # mal
  • ddl4x löscht die letzten Zeilen und entfernt sie für Striche am Boden des Kuchens, damit sie mit der Oberseite der unteren Ebene übereinstimmen
  • ggd$i_|_|_ ersetzt die erste Zeile durch die Oberseite des Kuchens
  • %cezentriert dann den ganzen Kuchen auf die Breite der untersten Schicht! !

1

SOGL V0.12 , 27 26 Bytes

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

Probieren Sie es hier aus!

Erläuterung:

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

Anonymes VBE-Direktfenster, das Eingaben von der Zelle entgegennimmt A1und einen Kuchen an das VBE-Direktfenster ausgibt

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

Drucke die oberste Zeile mit den Kerzen aus. Drucken Sie dann den Rest des Kuchens zwei Zeilen auf einmal.

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

SPCGibt bei Verwendung in einer PRINTAnweisung die angegebene Anzahl von Leerzeichen aus. Wenn ein negatives Argument angegeben wird, wird es günstigerweise als 0 behandelt, sodass die Tatsache, die indent - 2sich -2in der letzten Iteration befindet, kein Problem darstellt. STRING$Nimmt eine Zählung und einen Zeichencode (hier 45 für -) und wiederholt das Zeichen so oft. In diesem Fall muss die letzte Zeile (wann i=n) um 4 Bindestriche kürzer sein als sonst.


0

C (GCC) , 158 153 Bytes

-5 Bytes dank 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);}

Probieren Sie es online!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.