Faites-moi un gâteau!

15

Ceci est un gâteau:

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

Il mesure 8 de large, 3 de haut et 1 de profondeur.

Vous devez écrire un programme qui fait un gâteau à partir de 3 entrées. La première entrée contrôle le nombre de traits de soulignement au milieu et =s en haut. Voici le premier gâteau d'une largeur de 10 au lieu de 8:

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

La deuxième entrée contrôle la hauteur du gâteau. Voici le deuxième gâteau d'une hauteur de 4 au lieu de 3:

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

Notez la répétition des couches.

La troisième entrée contrôle sa profondeur. C'est juste le nombre de | |s à inclure en haut. Voici le troisième gâteau avec une profondeur de 2 au lieu de 1:

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

Vous pouvez imprimer des espaces de fin. Cas de test:

Entrée: 3, 3,3

Production:

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

(J'espère que je n'ai jamais ce gâteau)

Entrée: 3, 2,1

Production:

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

Entrée: 5, 5,5

Production:

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

la source
Les entrées seront-elles toujours des entiers positifs?
Nick Clifford
@ NickClifford oui.
Les sauts de ligne sont-ils autorisés?
Shaggy
3
En relation
dkudriavtsev
@Shaggy je suppose que oui, c'est oui par défaut sur Meta.
programmer5000

Réponses:

9

V , 25 , 20 octets

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

Essayez-le en ligne!

Hexdump:

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

Merci à @ nmjmcman101 d' avoir enregistré trois octets et de me rappeler un ancien opérateur qui avait enregistré deux octets supplémentaires.

Explication:

a,, bet csont les trois arguments.

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
DJMcMayhem
la source
Je pense que vous pouvez remplacer Ò r|$.par Ò|èpour certains octets. Essayez-le en ligne!
nmjcman101
@ nmjcman101 Oh mec, j'ai complètement oublié que èmême existé. J'ai dû me creuser la tête pour me souvenir de ce qu'il faisait. Mais c'est vraiment intelligent! En fait, en utilisant la variante en majuscule, vous È<char>pouvez probablement économiser quelques octets supplémentaires dans quelques autres endroits également. Merci de me le rappeler! :)
DJMcMayhem
4

Fusain , 34 26 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Prend les paramètres dans l'ordre largeur, profondeur, hauteur. Explication:

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

Mathematica, 167 octets

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]}]&
J42161217
la source
2

PHP> = 7.1, 104 octets

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

Version en ligne

Jörg Hülsermann
la source
1
Pas mal. Trouvé 3 octets: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
Et un autre 3 octets: $b=$i++<$t?$i>1:1+$_++%2.
Christoph
@Christoph Belle idée Merci
Jörg Hülsermann
1

Japt , 51 47 octets

"_{ç'=}_"+WçA="
|{ç}|" +(B="
+{ç'_}+" +(´V çA+B

Essayez-le en ligne!

L'entrée est prise dans l'ordre largeur, hauteur, profondeur.

Luc
la source
1

Gelée , 30 29 octets

-1 octet passant d'un ajout à un XOR pour traduire entre les colonnes externe et interne, permettant une recherche de 5 caractères plutôt que d'avoir deux _entrées.

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

Programme complet trois arguments de programme depth, height, widthet l' impression du gâteau.

Essayez-le en ligne!

Comment?

ṬṚ;⁹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
Jonathan Allan
la source
1

dc , 108 octets

?sdstsw95P61sc[lwsf[lcPlf1-dsf0<a]dsax]dsbx[_]p[[124P32sclbx[|]pld1-dsd0<j]dsjx43P95sclbx[+]plt1-dst0<h]dshx

Essayez-le en ligne!

R. Kap
la source
1

Java 7 , 169 164 158 octets

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

Essayez-le en ligne!

Non golfé:

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;
}
PunPun1000
la source
Vous pouvez économiser 1 octet en mettant u=t+u+"+\n" inside the for-loop: (u = t + u + "+ \ n; a [2] -> 1;) s + = t;`. Mais belle réponse, +1 de ma part.
Kevin Cruijssen
1

05AB1E , 33 31 octets

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

Essayez-le en ligne!

Explication

'_'=¹×«Ć,'|¹ú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
kalsowerus
la source
1

Windows Batch, 211 180 163 octets

Golfé un total de 48 octets grâce à @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=
stevefestl
la source
1
1. L'utilisation @sur chaque ligne et après doest légèrement plus courte que @echo off. 2. @call set w=%%w%%_évite setlocal enabledelayedexpansion. 3. Utilisez @for /l %%p in (2,1,%2). 4. À mon humble avis, vous devez ajouter@set w= pour que le code fonctionne plus d'une fois.
Neil
Je suis confus par la dernière partie, si je n'ajoute pas @set w=, le code ne fonctionnera-t-il pas plus d'une fois?
stevefestl
1
1. Votre @for /l %%p in (1,1,%1)dosemble avoir disparu. 2. Votre gâteau ne semble pas avoir la bonne hauteur, du moins il ne semble pas correspondre au cas de test lorsque je l'essaye. 3. Si vous exécutez le script deux fois dans la même session de commande, le gâteau devient de plus en plus large.
Neil
@Neil Tout est réparé :)
stevefestl
1
Génial! Juste quelques dernières choses que j'ai remarquées: 1. Vous n'avez pas besoin de l' @après &. 2 Si vous changez la deuxième boucle en (2,1,%3)et la troisième boucle en (1,1,%2)alors je pense que vous pouvez supprimer la echo +%w%+ligne. 3. Si j'ai compté correctement, je pense que vous devriez remplir les wespaces au lieu de_ s, car cela entraînera moins de substitutions. (J'utiliserais @call set w= %%w%%sinon l'espace est difficile à repérer!)
Neil
1

Haskell , 87 octets

f w t d=["_=| +_\n"!!j|i<-0:([2..d]>>[2])++([1..t]>>[2,4]),j<-i:([1..w]>>[i+1])++[i,6]]
faubi
la source
1
Bon travail, laissant la plupart des langues autres que le golf loin derrière. Une déclaration infixe (w#t)d= ...enregistre un octet.
Laikoni
1

SOGL V0.12 , 25 octets

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

Essayez-le ici!

Attend l'entrée en tant que largeur, profondeur, puis hauteur.

dzaima
la source
Est-il permis de réorganiser les entrées? Ils semblent spécifiés dans un ordre prescrit.
récursif du
1
@recursive Habituellement, c'est autorisé et nulle part la question ne force la commande et la 2e réponse la plus votée réorganise les entrées et a probablement été vue par l'OP, donc je suppose que ça va.
dzaima
1

Python 2, 124 122 120 120 105 92 octets

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

-15 octets en utilisant STDIN au lieu des arguments de programme

-13 octets en passant à Python 2 (pour input()les entiers et les printinstructions)

-12 octets de Caird Coinheringaahing

Essayez-le en ligne!

Python 3, 124 122 120 120 105 octets

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

Essayez-le en ligne!

Si un programme complet n'est pas requis:

Python 3, 87 84 octets

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

Essayez-le en ligne!

pizzapants184
la source
80 octets
caird coinheringaahing
@cairdcoinheringaahing 78 octets .
Jonathan Frech
0

Javascript (ES6), 161 157 octets

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

Axarydax
la source
0

Perl 5 , 85 + 1 (-a) = 86 octets

say"_".'='x($w=$F[0])."_\n".($l='|'.$"x$w."|\n")x($F[2]-1).("$l+".'_'x$w."+\n")x$F[1]

Essayez-le en ligne!

Xcali
la source
0

JavaScript / ES6, 90 octets

Je viens d'écrire une solution approximative et j'ai réussi à battre la réponse JS existante de 56 octets. Puis j'ai joué au golf sur 11 octets.

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

Voici une démo.

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

Nissa
la source