Buatkan saya kue!

15

Ini kue:

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

Ini 8 lebar, 3 tinggi, dan 1 dalam.

Anda harus menulis program yang membuat kue dari 3 input. Input pertama mengontrol berapa banyak garis bawah yang ada di tengah dan =s di atas. Ini kue pertama dengan lebar 10 bukannya 8:

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

Input kedua mengontrol seberapa tinggi kuenya. Ini kue kedua dengan tinggi 4 bukannya 3:

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

Perhatikan pengulangan lapisan.

Input ketiga mengontrol seberapa dalam itu. Itu hanya berapa banyak | |untuk dimasukkan di atas. Inilah kue ketiga dengan kedalaman 2 bukannya 1:

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

Anda dapat mencetak spasi spasi tambahan. Kasus uji:

Input: 3, 3,3

Keluaran:

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

(Saya harap saya tidak pernah mendapatkan kue ini)

Input: 3, 2,1

Keluaran:

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

Input: 5, 5,5

Keluaran:

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

sumber
Apakah input akan selalu bilangan bulat positif?
Nick Clifford
@NickClifford ya.
Apakah membuntuti baris baru diizinkan?
Shaggy
3
Terkait
dkudriavtsev
@ Shaggy saya berasumsi begitu, itu ya secara default di Meta.
programmer5000

Jawaban:

9

V , 25 , 20 byte

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

Cobalah online!

Hexdump:

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

Terima kasih kepada @ nmjmcman101 untuk menghemat tiga byte, dan mengingatkan saya pada operator lama yang menyimpan dua byte lagi.

Penjelasan:

a,, bdan ctiga argumen.

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
sumber
Saya pikir Anda dapat mengganti Ò r|$.dengan Ò|èuntuk beberapa byte. Cobalah online!
nmjcman101
@ nmjcman101 Ya ampun, aku benar-benar lupa kalau itu èada. Saya harus memutar otak untuk mengingat apa yang dilakukannya. Tapi itu sangat pintar! Bahkan, menggunakan varian huruf besar, È<char>mungkin dapat menyimpan lebih banyak byte di beberapa tempat lain juga. Terima kasih sudah mengingatkan saya! :)
DJMcMayhem
4

Arang , 34 26 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Mengambil parameter dalam urutan lebar, kedalaman, tinggi. Penjelasan:

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
sumber
2

Mathematica, 167 byte

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
sumber
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
";

Versi Online

Jörg Hülsermann
sumber
1
Tidak buruk. Ditemukan 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
Dan 3 byte lain: $b=$i++<$t?$i>1:1+$_++%2.
Christoph
@Christoph Ide bagus Terima Kasih
Jörg Hülsermann
1

Japt , 51 47 byte

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

Cobalah online!

Input diambil dalam urutan lebar, tinggi, kedalaman.

Luke
sumber
1

Jelly , 30 29 byte

-1 byte beralih dari tambahan ke XOR untuk menerjemahkan antara kolom luar dan dalam, memungkinkan untuk pencarian 5 karakter daripada memiliki dua _ entri.

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

Program lengkap mengambil tiga argumen program depth,height , widthdan mencetak kue.

Cobalah online!

Bagaimana?

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

dc , 108 byte

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

Cobalah online!

R. Kap
sumber
1

Java 7 , 169 164 158 byte

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

Cobalah online!

Tidak Disatukan:

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
sumber
Anda dapat menyimpan 1 byte dengan meletakkan u=t+u+"+\n" inside the for-loop: untuk (u = t + u + "+ \ n; a [2] -> 1;) s + = t;`. Tapi jawaban yang bagus, +1 dari saya.
Kevin Cruijssen
1

05AB1E , 33 31 byte

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

Cobalah online!

Penjelasan

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

Windows Batch, 211 180 163 byte

Golf total 48 byte berkat @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
sumber
1
1. Menggunakan @pada setiap baris dan setelah dosedikit lebih pendek dari @echo off. 2. @call set w=%%w%%_menghindari setlocal enabledelayedexpansion. 3. Gunakan @for /l %%p in (2,1,%2). 4. IMHO Anda harus menambahkan @set w=agar kode bekerja lebih dari satu kali.
Neil
Saya bingung dengan bagian terakhir, jika saya tidak menambahkan @set w=, apakah kode tidak akan berfungsi lebih dari sekali?
stevefestl
1
1. @for /l %%p in (1,1,%1)doSepertinya Anda hilang. 2. Ketinggian kue Anda sepertinya salah, paling tidak sepertinya tidak cocok dengan test case ketika saya mencobanya. 3. Jika Anda menjalankan skrip dua kali dalam sesi perintah yang sama maka kue hanya akan semakin luas.
Neil
@Neil Semuanya sudah diperbaiki :)
stevefestl
1
Bagus! Hanya beberapa hal terakhir yang saya perhatikan: 1. Anda tidak perlu @setelah &. 2 Jika Anda mengubah loop kedua ke (2,1,%3)dan loop ketiga ke (1,1,%2)maka saya pikir Anda dapat menghapus echo +%w%+baris. 3. Jika saya telah menghitung dengan benar, maka saya pikir Anda harus mengisi wdengan spasi, bukan _s, karena itu akan menghasilkan lebih sedikit penggantian. (Saya akan menggunakan @call set w= %%w%%ruang yang sulit dikenali!)
Neil
1

Haskell , 87 byte

f w t d=["_=| +_\n"!!j|i<-0:([2..d]>>[2])++([1..t]>>[2,4]),j<-i:([1..w]>>[i+1])++[i,6]]
faubi
sumber
1
Pekerjaan bagus meninggalkan sebagian besar bahasa non-golf jauh di belakang. Deklarasi infiks (w#t)d= ...menyimpan byte.
Laikoni
1

SOGL V0.12 , 25 byte

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

Coba Di Sini!

Mengharapkan input sebagai lebar, kedalaman, lalu tinggi.

dzaima
sumber
Apakah diizinkan untuk memesan ulang input? Mereka tampaknya ditentukan dalam urutan yang ditentukan.
rekursif
1
@recursive Biasanya diizinkan dan tidak ada pertanyaan yang memaksakan urutan dan jawaban ke-2 yang paling banyak dipilih mengatur ulang input dan mungkin telah dilihat oleh OP, jadi saya akan menganggapnya baik-baik saja.
dzaima
1

Python 2, 124 122 120 105 92 byte

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

-15 byte dengan menggunakan STDIN bukan argumen program

-13 byte dengan beralih ke Python 2 (untuk input() bilangan bulat dan printpernyataan)

-12 byte dari Caird Coinheringaahing

Cobalah online!

Python 3, 124 122 120 105 byte

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

Cobalah online!

Jika program lengkap tidak diperlukan:

Python 3, 87 84 byte

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

Cobalah online!

pizzapants184
sumber
80 byte
caird coinheringaahing
@cairdcoinheringaahing 78 byte .
Jonathan Frech
0

Javascript (ES6), 161 157 byte

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

Python 2 , 93 byte

i,j,k=input()
l=["|"+" "*i+"|"]
for x in["_"+"="*i+"_"]+l*(k-1)+(l+["+"+"_"*i+"+"])*j:print x

Cobalah online!

ElPedro
sumber
0

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

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

Cobalah online!

Xcali
sumber
0

JavaScript / ES6, 90 byte

Saya baru saja menulis solusi kasar, dan kebetulan mengalahkan jawaban JS yang ada dengan 56 byte kekalahan. Lalu saya bermain golf 11 byte.

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

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

Nissa
sumber
0

Kanvas , 23 byte

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

Coba di sini!

dzaima
sumber