Faça-me um bolo!

15

Este é um bolo:

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

Tem 8 de largura, 3 de altura e 1 de profundidade.

Você deve escrever um programa que faça um bolo com 3 entradas. A primeira entrada controla quantos sublinhados existem no meio =es na parte superior. Aqui está o primeiro bolo com uma largura de 10 em vez de 8:

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

A segunda entrada controla a altura do bolo. Aqui está o segundo bolo com uma altura de 4 em vez de 3:

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

Observe a repetição das camadas.

A terceira entrada controla a profundidade. Isso é quantos | |s para incluir na parte superior. Aqui está o terceiro bolo com profundidade de 2 em vez de 1:

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

Você pode imprimir espaços em branco à direita. Casos de teste:

Entrada: 3, 3,3

Resultado:

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

(Espero nunca conseguir esse bolo)

Entrada: 3, 2,1

Resultado:

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

Entrada: 5, 5,5

Resultado:

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

fonte
As entradas sempre serão números inteiros positivos?
Nick Clifford
@NickClifford yes.
As novas linhas à direita são permitidas?
Shaggy
3
Relacionado
dkudriavtsev
@ Shaggy eu diria que sim, por padrão no Meta.
Programmer5000 #

Respostas:

9

V , 25 , 20 bytes

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

Experimente online!

Hexdump:

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

Obrigado a @ nmjmcman101 por salvar três bytes e me lembrar de um operador antigo que salvou outros dois bytes.

Explicação:

a,, be csão os três argumentos.

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
fonte
Eu acho que você pode substituir Ò r|$.com Ò|èpara alguns bytes. Experimente online!
nmjcman101
@ nmjcman101 Oh cara, eu esqueci completamente que èaté existia. Eu tive que mexer no meu cérebro para lembrar o que ele faz. Mas isso é realmente inteligente! De fato, o uso da variante maiúscula È<char>provavelmente também pode salvar mais alguns bytes em alguns outros lugares. Obrigado por me lembrar! :)
DJMcMayhem
4

Carvão , 34 26 bytes

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

Experimente online! Link é a versão detalhada do código. Toma parâmetros na largura, profundidade e altura da ordem. Explicação:

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
fonte
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]}]&
J42161217
fonte
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
";

Versão Online

Jörg Hülsermann
fonte
1
Não é ruim. Encontrado 3 bytes: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
E outros 3 bytes: $b=$i++<$t?$i>1:1+$_++%2.
Christoph
@Christoph Nice idea Thank You
Jörg Hülsermann 23/17
1

Japonês , 51 47 bytes

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

Experimente online!

A entrada é obtida na largura, altura e profundidade da ordem.

Lucas
fonte
1

Geléia , 30 29 bytes

Alternância de -1 byte de uma adição a um XOR para converter entre colunas externas e internas, permitindo uma pesquisa de 5 caracteres em vez de ter duas _entradas.

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

Programa completo de tomar três argumentos do programa de depth, height, widthe imprimir o bolo.

Experimente online!

Quão?

ṬṚ;⁹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
fonte
1

dc , 108 bytes

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

Experimente online!

R. Kap
fonte
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;}

Experimente 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;
}
PunPun1000
fonte
Você pode economizar 1 byte colocando u=t+u+"+\n" inside the for-loop: for (u = t + u + "+ \ n; a [2] -> 1;) s + = t;`. Mas uma boa resposta, +1 de mim.
Kevin Cruijssen
1

05AB1E , 33 31 bytes

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

Experimente online!

Explicação

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

Lote do Windows, 211 180 163 bytes

Jogou um total de 48 bytes graças ao @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
fonte
1
1. Usar @em cada linha e depois doé um pouco menor que @echo off. 2. @call set w=%%w%%_evita setlocal enabledelayedexpansion. 3. Use @for /l %%p in (2,1,%2). 4. IMHO você deve adicionar @set w=para que o código funcione mais de uma vez.
Neil
Estou confuso com a última parte, se não adicionar @set w=, o código não funcionará mais de uma vez?
Stevefestl 23/05
1
1. Seu @for /l %%p in (1,1,%1)doparece ter desaparecido. 2. Seu bolo parece ter a altura errada, pelo menos não parece coincidir com o caso de teste quando eu tento. 3. Se você executar o script duas vezes na mesma sessão de comando, o bolo ficará cada vez mais amplo.
Neil
@Neil É tudo fixo :)
stevefestl
1
Ótimo! Apenas algumas últimas coisas que notei: 1. Você não precisa do @depois do &. 2 Se você alterar o segundo loop para (2,1,%3)e o terceiro loop para (1,1,%2), acho que pode excluir a echo +%w%+linha. 3. Se contei corretamente, acho que você deve preencher wespaços em vez de _s, pois isso resultará em menos substituições. (Eu usaria @call set w= %%w%%se de outra forma o espaço é difícil de detectar!)
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]]
faubi
fonte
1
Bom trabalho, deixando para trás a maioria das línguas que não jogam golfe. Uma declaração infix (w#t)d= ...salva um byte.
Laikoni 23/05
1

SOGL V0.12 , 25 bytes

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

Experimente aqui!

Espera a entrada como largura, profundidade e altura.

dzaima
fonte
É permitido reordenar entradas? Eles parecem especificados em uma ordem prescrita.
recursivo
1
@recursive Normalmente, é permitido e em nenhum lugar a pergunta força a ordem, e a segunda resposta mais votada reordena as entradas e provavelmente foi vista pelo OP, então eu presumo que está tudo bem.
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 usando STDIN em vez de argumentos do programa

-13 bytes mudando para Python 2 (por input() números inteiros e printinstrução)

-12 bytes de Caird Coinheringaahing

Experimente 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*"_"+"+"))

Experimente online!

Se um programa completo não for necessário:

Python 3, 87 84 bytes

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

Experimente online!

pizzapants184
fonte
80 bytes
caird coinheringaahing
@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));

Axarydax
fonte
0

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

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

Experimente online!

Xcali
fonte
0

JavaScript / ES6, 90 bytes

Acabei de escrever uma solução aproximada e, por acaso, superei a resposta JS existente em 56 bytes. Depois joguei 11 bytes.

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

Aqui está uma demonstração.

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
fonte
0

Tela , 23 bytes

|*_⁷⇵×+×∔║│P
=×_eP⁸╷{1⁸

Experimente aqui!

dzaima
fonte