Back mir einen Kuchen!


15

Das ist ein Kuchen:

_========_
|        |
+________+
|        |
+________+
|        |
+________+

Es ist 8 breit, 3 hoch und 1 tief.

Sie müssen ein Programm schreiben, das aus 3 Eingaben einen Kuchen macht. Die erste Eingabe steuert, wie viele Unterstriche sich in der Mitte und =oben befinden. Hier ist der erste Kuchen mit einer Breite von 10 statt 8:

_==========_
|          |
+__________+
|          |
+__________+
|          |
+__________+

Die zweite Eingabe steuert, wie groß der Kuchen ist. Hier ist der zweite Kuchen mit einer Höhe von 4 statt 3:

_==========_
|          |
+__________+
|          |
+__________+
|          |
+__________+
|          |
+__________+

Beachten Sie die Wiederholung der Ebenen.

Die dritte Eingabe steuert, wie tief es ist. Das ist, wie viele | |s auf der Oberseite enthalten sein sollen. Hier ist der dritte Kuchen mit einer Tiefe von 2 statt 1:

_==========_
|          |
|          |
+__________+
|          |
+__________+
|          |
+__________+
|          |
+__________+

Sie können nachfolgende Leerzeichen drucken. Testfälle:

Input: 3, 3,3

Ausgabe:

_===_
|   |
|   |
|   |
+___+
|   |
+___+
|   |
+___+

(Ich hoffe, ich bekomme diesen Kuchen nie)

Input: 3, 2,1

Ausgabe:

_===_
|   |
+___+
|   |
+___+

Input: 5, 5,5

Ausgabe:

_=====_
|     |
|     |
|     |
|     |
|     |
+_____+
|     |
+_____+
|     |
+_____+
|     |
+_____+
|     |
+_____+

Werden Eingaben immer positive ganze Zahlen sein?
Nick Clifford

@ NickClifford ja.

Sind nachgestellte Zeilenumbrüche erlaubt?
Shaggy


@ Shaggy Ich würde davon ausgehen, es ist ja standardmäßig auf Meta.
programmer5000

Antworten:


9

V , 25 , 20 Bytes

2é_Àé=ÙÒ|èÙÒ+È_ÀäkÀÄ

Probieren Sie es online!

Hexdump:

00000000: 32e9 5fc0 e93d d9d2 7ce8 d9d2 2bc8 5fc0  2._..=..|...+._.
00000010: e46b c0c4                                .k..

Vielen Dank an @ nmjmcman101 für das Speichern von drei Bytes und das Erinnern an einen alten Operator, der zwei weitere Bytes gespeichert hat.

Erläuterung:

a, bund csind die drei Argumente.

2é_                   " Insert two '_' characters
   Àé=                " Insert 'a' '=' characters between them
      Ù               " Duplicate this line
       Ò|             " Replace this whole line with '|'s
         è            " *Hollow* this line (replace all the middle characters with spaces)
          Ù           " Duplicate this line
           Ò+         " Replace this whole line with '+'s
             È_       " *Hollow* this line again, but use '_' instead of spaces
               Àäk    " Make 'b' copies of this line and the line above it
                  ÀÄ  " Make 'c' copies of this line

Ich glaube , Sie ersetzen kann Ò r|$.mit Ò|èeinigem Bytes. Probieren Sie es online!
nmjcman101

@ nmjcman101 Oh man, ich habe völlig vergessen, dass èes das überhaupt gibt. Ich musste mir den Kopf zerbrechen, um mich daran zu erinnern, was es tut. Aber das ist wirklich schlau! Tatsächlich kann die Verwendung der Großbuchstabenvariante È<char>wahrscheinlich auch an einigen anderen Stellen mehr Bytes einsparen. Danke, dass du mich erinnert hast! :)
DJMcMayhem

4

Kohle , 34 26 Bytes

Nγ←×γ_↑+↑N_×γ=‖BOγF⁻N¹C⁰±²

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Übernimmt Parameter in der Reihenfolge Breite, Tiefe, Höhe. Erläuterung:

Nγ          Input the width.
←×γ_        Print a set of _s that go at the bottom of each layer.
↑+          Print one of the +s that go on the left.
↑N          Input the depth and print that many left |s.
_           Print the top left _.
×γ=         Print the =s along the top.
‖BOγ        Copy the left column to the right.
F           Repeat:
 ⁻ ¹         One time fewer than:
  N           Input of the height:
    C⁰±²        Copy the whole cake up 2 characters.

2

Mathematica, 167 Bytes

c=Column;r=Row;t=Table;f=Flatten;c[c/@{r/@f[{{{"_",r@t["=",#],"_"}},t[{"|",r@t[" ",#],"|"},#3-1]},1],c/@f[{t[{r@{"|",r@t[" ",#],"|"},r@{"+",r@t["_",#],"+"}},#2]},1]}]&

2

PHP> = 7.1, 104 Bytes

for([,$w,$h,$t]=$argv;$i<2*$h+$t;)echo str_pad($e="_|+"[$b=$i++<$t?$i>1:1+$_++%2],$w+1,"= _"[$b])."$e
";

Online Version


1
Nicht schlecht. Gefunden 3 Byte:for([,$w,$h,$t]=$argv;$i<2*$h+$t;)echo str_pad($e="_|+"[$b=$i++<$t?$i>1:2-($i-$t&1)],$w+1,"= _"[$b])."$e\n";
Christoph

1
Und noch ein 3 - Byte: $b=$i++<$t?$i>1:1+$_++%2.
Christoph

@Christoph Schöne Idee Danke
Jörg Hülsermann



1

Gelee , 30 29 Bytes

-1-Byte-Umschaltung von einer Addition zu einem XOR, um zwischen äußeren und inneren Spalten zu übersetzen. Dies ermöglicht eine Suche nach 5 Zeichen anstelle von zwei _Einträgen.

ṬṚ;⁹RḤṬḤ¤Wµ^9ẋ⁵;@;µZị“_+= |”Y

Das vollständige Programm unter drei Programmargumente depth, height, widthund Drucken des Kuchens.

Probieren Sie es online!

Wie?

ṬṚ;⁹RḤṬḤ¤Wµ^9ẋ⁵;@;µZị“_+= |”Y - Main link: depth, height (width is a program argument)
Ṭ                             - untruth   [0,0,0,...1] such that the length is the depth
 Ṛ                            - reverse   [1,0,0,...0]
        ¤                     - nilad followed by link(s) as a nilad:
   ⁹                          -   link's right argument, height
    R                         -   range   [1,2,3,...,height]
     Ḥ                        -   double  [2,4,6,...,2*height]
      Ṭ                       -   untruth [0,1,0,1,0,1,...,0,1] (length double height)
       Ḥ                      -   double  [0,2,0,2,0,2,...,0,2]
  ;                           - concatenate  [1,0,0,...,0,0,2,0,2,0,2,...,0,2]
                              -     ...this is the form of a column of cake!
         W                    - wrap in a list
          µ                   - monadic chain separation, call that c
           ^9                 - bitwise XOR c with 9 [8,9,9,...,9,9,11,9,11,9,11,...,9,11]
              ⁵               - program's 3rd argument, width
             ẋ                - repeat the augmented c width times
               ;@             - concatenate with a copy of c
                 ;            - concatenate a copy of c
                  µ           - monadic chain separation call that sideways cake
                   Z          - transpose the sideways cake to put it the right way up
                     “_+= |”  - literal ['_','+','=',' ','|'] (cake decoration)
                    ị         - index into (1 based and modular, so 8,9, and 11 are, mod 5,
                                            3, 4, and 1 yielding '=', ' ', and '_')
                            Y - join with new lines
                              - implicit print



1

Java 7 , 169 164 158 Bytes

String f(int...a){String s="_",t="|",u="+";for(;a[0]-->0;s+="=",t+=" ")u+="_";s=s+"_";t="\n"+t+"|";u=t+"\n"+u+"+";for(;a[2]-->1;)s+=t;for(;a[1]-->0;)s+=u;return s;}

Probieren Sie es online!

Ungolfed:

String f(int...a)                    // saves two bytes over int a, int b, int c
{
    String s="_", t="|", u="+";      // set up the start of each row

    for(; a[0]-->0; s+="=", t+=" ")  // Uses the goes-to operator to fill the row
        u+="_";                      

    s += "_\n";                      // adds the end of each row
    t += "|\n";              
    u = t + u + "+\n";               // and combining t into u

    for(; a[2]-->1; )                // add the top of the cake
        s += t;

    for(; a[1]-->0; )                // add the rest of the cake
        s += u;

    return s;
}

Sie können 1 Byte einsparen, indem Sie u=t+u+"+\n" inside the for-loop: für (u = t + u + "+ \ n; a [2] -> 1;) s + = t;`. Aber nette Antwort, +1 von mir.
Kevin Cruijssen

1

05AB1E , 33 31 Bytes

'_'=¹×«Ć,'|¹úRĆ³G=}²F='+'_¹×«Ć,

Probieren Sie es online!

Erläuterung

'_'=¹×«Ć,'|¹úRĆ³G=}²F='+'_¹×«Ć,   Main link. Args: w h d
'_                                Push literal '_'
  '=¹×                            Push '=' w times
      «Ć,                         Concat, enclose and print
         '|                       Push literal '|'
           ¹ú                     Pad with w spaces in front
             RĆ                   Reverse and ecnlose
               ³G }               d - 1 times do:
                 =                Print without consuming
                   ²F             h times do:
                     =            Print without consuming
                      '+          Push literal '+'
                        '_¹×      Push '_' w times
                            «Ć,   Concat, enclose and print

1

Windows Batch, 211 180 163 Bytes

Insgesamt 48 Bytes dank @Neil!

@for /l %%p in (1,1,%1)do @call set w= %%w%%
@echo _%w: ==%_
@for /l %%p in (2,1,%3)do @echo ^|%w%^|
@for /l %%p in (1,1,%2)do @echo ^|%w%^|&echo +%w: =_%+
@set w=

1
1. Verwenden Sie @in jeder Zeile und danach doetwas kürzer als @echo off. 2. @call set w=%%w%%_vermeidet setlocal enabledelayedexpansion. 3. Verwenden Sie @for /l %%p in (2,1,%2). 4. IMHO sollten Sie hinzufügen, @set w=damit der Code mehr als einmal funktioniert.
Neil

Ich bin durch den letzten Teil verwirrt. Wenn ich ihn nicht hinzufüge @set w=, funktioniert der Code dann nicht mehrmals?
Stevefestl

1
1. Ihr @for /l %%p in (1,1,%1)doscheint verschwunden zu sein. 2. Dein Kuchen scheint die falsche Höhe zu haben, zumindest scheint er nicht mit dem Testfall übereinzustimmen, wenn ich es versuche. 3. Wenn Sie das Skript zweimal in derselben Befehlssitzung ausführen, wird der Kuchen immer breiter.
Neil

@ Neil Es ist alles behoben :)
Stevefestl

1
Groß! Nur ein paar letzte Dinge, die mir aufgefallen sind: 1. Du brauchst das nicht @nach dem &. 2 Wenn Sie die zweite Schleife in (2,1,%3)und die dritte Schleife in ändern (1,1,%2), können Sie die echo +%w%+Zeile meines Erachtens löschen . 3. Wenn ich richtig gezählt habe, sollten Sie wLeerzeichen anstelle von _s eingeben, da dies zu weniger Substitutionen führt. (Ich würde verwenden, @call set w= %%w%%da sonst der Raum schwer zu erkennen ist!)
Neil

1

Haskell , 87 Bytes

f w t d=["_=| +_\n"!!j|i<-0:([2..d]>>[2])++([1..t]>>[2,4]),j<-i:([1..w]>>[i+1])++[i,6]]

1
Netter Job, der die meisten nicht-golfenden Sprachen hinter sich lässt. Eine Infix-Deklaration (w#t)d= ...speichert ein Byte.
Laikoni

1

SOGL V0.12 , 25 Bytes

e =*¼_Oe↕¼|.⌡Qe╔*¼+.H«{Q;

Probieren Sie es hier aus!

Erwartet die Eingabe als Breite, Tiefe und dann als Höhe.


Darf man Eingaben nachbestellen? Sie scheinen in einer vorgeschriebenen Reihenfolge angegeben zu sein.
rekursive

1
@recursive Normalerweise ist es erlaubt und nirgendwo erzwingt die Frage die Reihenfolge und die am zweithäufigsten gewählte Antwort ordnet die Eingaben neu und wurde wahrscheinlich vom OP gesehen, also würde ich annehmen, dass es in Ordnung ist.
Dzaima

1

Python 2, 124 122 120 105 92 Bytes

w,t,d=input()
a="\n|"+w*" "+"|"
print"_"+w*"="+"_"+(d-1)*a+t*(a+"\n+"+w*"_"+"+")

-15 Bytes mit STDIN anstelle von Programmargumenten

-13 Bytes durch Umschalten auf Python 2 (für input()Ganzzahlen und printAnweisungen)

-12 Bytes von Caird Coinheringaahing

Probieren Sie es online!

Python 3, 124 122 120 105 Bytes

w,t,d=[int(input())for n in(1,2,3)]
a="\n|"+w*" "+"|"
print("_"+w*"="+"_"+(d-1)*a+t*(a+"\n+"+w*"_"+"+"))

Probieren Sie es online!

Wenn kein vollständiges Programm erforderlich ist:

Python 3, 87 84 Bytes

lambda w,t,d:"_"+w*"="+"_"+(d-1)*("\n|"+w*" "+"|")+t*("\n|"+w*" "+"|\n+"+w*"_"+"+")

Probieren Sie es online!



@cairdcoinheringaahing 78 Bytes .
Jonathan Frech

0

Javascript (ES6), 161 157 Bytes

f=(w,h,d)=>{r=x=>x.repeat(w);_='_';m='+'+r(_)+'+';b='|'+r(' ')+'|';c=[_+r('=')+_];for(i=d-1;i--;)
c.push(b);for(i=h;i--;)
c.push(b+'\n'+m);return c.join`\n`}

console.log(f(8,3,1));




0

JavaScript / ES6, 90 Byte

Ich habe gerade eine grobe Lösung geschrieben und die vorhandene JS-Antwort um satte 56 Bytes übertroffen. Dann habe ich 11 Bytes abgespielt.

(w,h,d,g=a=>a+a[1][r='repeat'](w)+a[0]+`
`)=>g('_=')+(l=g('| '))[r](d-1)+(l+g('+_'))[r](h)

Hier ist eine Demo.

var F = (w,h,d,f=a=>a+a[1][r='repeat'](w)+a[0]+`
`)=>f('_=')+(l=f('| '))[r](d-1)+(l+f('+_'))[r](h);

console.log(F(prompt('width') || 3, prompt('height') || 3, prompt('depth') || 3));
console.log(F.toString().length);


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.