Nướng cho tôi một cái bánh!


15

Đây là một chiếc bánh:

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

Nó rộng 8, cao 3 và sâu 1.

Bạn phải viết một chương trình làm bánh từ 3 đầu vào. Đầu vào đầu tiên kiểm soát có bao nhiêu dấu gạch dưới ở giữa và =s trên đỉnh. Đây là chiếc bánh đầu tiên có chiều rộng 10 thay vì 8:

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

Đầu vào thứ hai kiểm soát chiều cao của bánh. Đây là chiếc bánh thứ hai có chiều cao bằng 4 thay vì 3:

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

Lưu ý sự lặp lại của các lớp.

Đầu vào thứ ba kiểm soát độ sâu của nó. Đó chỉ là bao nhiêu | |s để bao gồm trên đầu trang. Đây là chiếc bánh thứ ba có độ sâu 2 thay vì 1:

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

Bạn có thể in khoảng trắng theo sau. Các trường hợp thử nghiệm:

Input: 3, 3,3

Đầu ra:

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

(Tôi hy vọng tôi không bao giờ có được chiếc bánh này)

Input: 3, 2,1

Đầu ra:

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

Input: 5, 5,5

Đầu ra:

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

Đầu vào sẽ luôn là số nguyên dương?
Nick Clifford

@NickClifford có.

Được kéo dài dòng mới được phép?
Xù xì


@Shaggy tôi giả sử như vậy, theo mặc định là có trên Meta.
lập trình

Câu trả lời:


9

V , 25 , 20 byte

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

Hãy thử trực tuyến!

Hexdump:

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

Nhờ vào @ nmjmcman101 vì đã lưu ba byte và nhắc nhở tôi về một toán tử cũ đã lưu hai byte khác.

Giải trình:

a, bclà ba đối số.

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

Tôi nghĩ bạn có thể thay thế Ò r|$.bằng Ò|èmột số byte. Hãy thử trực tuyến!
nmjcman101

@ nmjcman101 Ôi trời, tôi hoàn toàn quên mất rằng èthậm chí còn tồn tại. Tôi đã phải cân não để nhớ những gì nó làm. Nhưng điều đó thực sự thông minh! Trong thực tế, sử dụng biến thể chữ hoa, È<char>có thể có thể lưu thêm một số byte ở một vài nơi khác. Cảm ơn vì đã nhắc tôi! :)
DJMcMayhem

4

Than , 34 26 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Lấy tham số theo thứ tự chiều rộng, chiều sâu, chiều cao. Giải trình:

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

Toán học, 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]}]&

2

PHP> = 7.1, 104 byte

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

Phiên bản trực tuyến


1
Không tệ. Tìm thấy 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
Và thêm 3 byte : $b=$i++<$t?$i>1:1+$_++%2.
Christoph

@Christoph Ý tưởng tuyệt vời Cảm ơn bạn
Jörg Hülsermann



1

Thạch , 30 29 byte

-1 byte chuyển từ một bổ sung sang XOR để dịch giữa các cột bên ngoài và bên trong, cho phép tra cứu 5 ký tự thay vì có hai _mục nhập.

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

Full chương trình lấy ba tham số chương trình depth, height, widthvà in bánh.

Hãy thử trực tuyến!

Làm sao?

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

Hãy thử trực tuyến!

Ung dung:

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

Bạn có thể tiết kiệm 1 byte bằng cách đặt u=t+u+"+\n" inside the for-loop: (u = t + u + "+ \ n; a [2] -> 1;) s + = t;`. Nhưng câu trả lời hay, +1 từ tôi.
Kevin Cruijssen

1

05AB1E , 33 31 byte

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

Hãy thử trực tuyến!

Giải trình

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

Batch Windows, 211 180 163 byte

Đã chơi tổng cộng 48 byte nhờ @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. Sử dụng @trên mỗi dòng và sau dongắn hơn một chút @echo off. 2. @call set w=%%w%%_tránh setlocal enabledelayedexpansion. 3. Sử dụng @for /l %%p in (2,1,%2). 4. IMHO bạn nên thêm @set w=để mã hoạt động nhiều lần.
Neil

Tôi bối rối bởi phần cuối cùng, nếu tôi không thêm @set w=, mã sẽ không hoạt động thêm một lần nữa chứ?
stevefestl

1
1. của bạn @for /l %%p in (1,1,%1)do dường như đã mất tích. 2. Bánh của bạn dường như là chiều cao sai, ít nhất là nó dường như không khớp với trường hợp thử nghiệm khi tôi thử. 3. Nếu bạn chạy tập lệnh hai lần trong cùng một phiên lệnh thì chiếc bánh sẽ ngày càng rộng hơn.
Neil

@Neil Tất cả đã được sửa :)
stevefestl

1
Tuyệt quá! Chỉ một vài điều cuối cùng tôi nhận thấy: 1. Bạn không cần @sau &. 2 Nếu bạn thay đổi vòng lặp thứ hai thành (2,1,%3)và vòng lặp thứ ba thành (1,1,%2)thì tôi nghĩ bạn có thể xóaecho +%w%+ dòng này. 3. Nếu tôi đã đếm chính xác, thì tôi nghĩ bạn nên điền vào wchỗ trống thay vì _s, vì điều đó sẽ dẫn đến ít sự thay thế hơn. (Tôi sẽ sử dụng @call set w= %%w%%nếu không không gian rất khó phát hiện!)
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]]

1
Công việc tốt đẹp để lại hầu hết các ngôn ngữ không chơi golf phía sau. Một khai báo infix (w#t)d= ...lưu một byte.
Laikoni

1

SOGL V0.12 , 25 byte

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

Hãy thử nó ở đây!

Mong đợi đầu vào là chiều rộng, chiều sâu, sau đó chiều cao.


Được phép đặt hàng lại đầu vào? Họ dường như được chỉ định trong một trật tự quy định.
đệ quy

1
@recursive Thông thường, điều đó được cho phép và không nơi nào câu hỏi buộc phải đặt hàng và câu trả lời được bình chọn nhiều thứ 2 sẽ sắp xếp lại các đầu vào và có thể đã được OP nhìn thấy, vì vậy tôi cho rằng nó ổn.
dzaima

1

Con trăn 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 bằng cách sử dụng STDIN thay vì đối số chương trình

-13 byte bằng cách chuyển sang Python 2 (cho input() số nguyên và printcâu lệnh)

-12 byte từ Caird Coinheringaahing

Hãy thử trực tuyến!

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

Hãy thử trực tuyến!

Nếu một chương trình đầy đủ là không cần thiết:

Python 3, 87 84 byte

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

Hãy thử trực tuyến!



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




0

JavaScript / ES6, 90 byte

Tôi vừa viết một giải pháp sơ bộ và tình cờ đánh bại câu trả lời JS hiện có bằng một con số khổng lồ 56 byte. Sau đó, tôi đánh gôn 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)

Đây là một bản 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);


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.