케이크 줘!


15

이것은 케이크입니다.

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

넓이 8, 높이 3, 깊이 1입니다.

3 개의 입력으로 케이크를 만드는 프로그램을 작성해야합니다. 첫 번째 입력은 중간과 =s에있는 밑줄의 수를 제어합니다 . 다음은 너비가 10이 아닌 첫 번째 케이크입니다.

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

두 번째 입력은 케이크의 높이를 제어합니다. 3이 아닌 높이가 4 인 두 번째 케이크입니다.

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

레이어의 반복에 주목하십시오.

세 번째 입력은 그 깊이를 제어합니다. 그 | |위에 몇 개 를 포함시켜야합니까? 다음은 1 대신에 깊이가 2 인 세 번째 케이크입니다.

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

후행 공백을 인쇄 할 수 있습니다. 테스트 사례 :

입력 : 3, 3,3

산출:

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

(나는이 케이크를 얻지 않기를 바랍니다)

입력 : 3, 2,1

산출:

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

입력 : 5, 5,5

산출:

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

입력은 항상 양의 정수입니까?
Nick Clifford

@NickClifford 예.

후행 줄 바꿈이 허용됩니까?
Shaggy


@Shaggy 나는 그렇게 가정합니다 .Meta에서는 기본적으로 그렇습니다.
programmer5000

답변:


9

V , 25 , 20 바이트

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

온라인으로 사용해보십시오!

16 진 덤프 :

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

3 바이트를 저장하고 또 다른 2 바이트를 절약 한 이전 연산자를 상기시켜 준 @ nmjmcman101 에게 감사드립니다 .

설명:

a, bc세 가지 인수입니다.

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

나는 당신이 바꿀 수 있다고 생각 Ò r|$.Ò|è일부 바이트. 온라인으로 사용해보십시오!
nmjcman101

@ nmjcman101 오, 나는 è존재조차도 완전히 잊었다 . 나는 그것이 무엇을 하는지를 기억하기 위해 내 머리를 담아 야했다. 그러나 그것은 정말 영리합니다! 실제로 대문자 변형을 사용하면 È<char>다른 곳에서도 바이트를 더 절약 할 수 있습니다. 상기시켜 주셔서 감사합니다! :)
DJMcMayhem 17:32에

4

, 34 26 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 순서 너비, 깊이, 높이의 매개 변수를 사용합니다. 설명:

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

수학, 167 바이트

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 바이트

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

온라인 버전


1
나쁘지 않다. 발견 3 바이트 :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
그리고 다른 3 바이트 : $b=$i++<$t?$i>1:1+$_++%2.
Christoph

@Christoph 좋은 생각 감사합니다
Jörg Hülsermann



1

젤리 , 30 29 바이트

외부 열과 내부 열 간을 변환하기 위해 XOR에 추가하여 -1 바이트를 전환하여 두 개의 _항목이 아닌 5 개의 문자를 조회 할 수 있습니다.

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

전체 프로그램의 세 가지 프로그램 인수를 고려 depth, height, width와 케이크를 인쇄.

온라인으로 사용해보십시오!

어떻게?

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

자바 7 , 169 164 158 바이트

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

온라인으로 사용해보십시오!

언 골프 드 :

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

u=t+u+"+\n" inside the for-loop: for (u = t + u + "+ \ n; a [2]-> 1;) s + = t;` 를 넣어 1 바이트를 절약 할 수 있습니다 . 그러나 좋은 대답은 +1입니다.
Kevin Cruijssen

1

05AB1E , 33 31 바이트

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

온라인으로 사용해보십시오!

설명

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

윈도우 배치, 211 180 163 바이트

@Neil 덕분에 총 48 바이트를 기록했습니다!

@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. @각 줄마다 사용 하는 do것이보다 약간 짧습니다 @echo off. 2. @call set w=%%w%%_피하십시오 setlocal enabledelayedexpansion. 3.를 사용하십시오 @for /l %%p in (2,1,%2). 4. IMHO @set w=코드가 두 번 이상 작동하도록 추가해야합니다 .
Neil

추가하지 않으면 마지막 부분이 혼란 스럽습니다. @set w=코드가 한 번 이상 작동하지 않습니까?
stevefestl

1
1. 당신의 @for /l %%p in (1,1,%1)do실종 된 것 같습니다. 2. 당신의 케이크는 잘못된 높이 인 것 같습니다. 적어도 시도 할 때 테스트 케이스와 일치하지 않는 것 같습니다. 3. 동일한 명령 세션에서 스크립트를 두 번 실행하면 케이크가 점점 넓어집니다.
Neil

@Neil 그것은 모두 고정 :)
stevefestl

1
큰! 내가 마지막으로 알아 차린 몇 가지 : 1. 당신은 @후가 필요하지 않습니다 &. 2 두 번째 루프를 (2,1,%3)세 번째 루프로 변경 (1,1,%2)하면 echo +%w%+선을 삭제할 수 있다고 생각합니다 . 3. 정확하게 세면 s w대신 공백을 채워야 하므로 _대체 횟수가 줄어 듭니다. ( @call set w= %%w%%그렇지 않으면 공간을
Neil

1

하스켈 , 87 바이트

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

1
골프가 아닌 대부분의 언어를 버리는 멋진 직업. infix 선언 (w#t)d= ...은 바이트를 저장합니다.
Laikoni

1

SOGL V0.12 , 25 바이트

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

여기 사용해보십시오!

입력을 너비, 깊이 및 높이로 예상합니다.


입력을 다시 주문할 수 있습니까? 그들은 정해진 순서대로 명시된 것 같습니다.
재귀

1
@recursive 일반적으로 허용되며 질문이 순서를 강요하지 않으며 두 번째로 가장 많이 투표 된 답변은 입력을 재정렬하며 아마도 OP에 의해 보였을 것이므로 괜찮습니다.
dzaima

1

파이썬 (2), 124 (122) 120 (105) 92 바이트

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

프로그램 인수 대신 STDIN을 사용하여 -15 바이트

Python 2로 전환하여 -13 바이트 ( input()정수 및print 명령문)

Caird Coinheringaahing에서 -12 바이트

온라인으로 사용해보십시오!

파이썬 3 124 122 120 105 바이트

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

온라인으로 사용해보십시오!

전체 프로그램이 필요하지 않은 경우 :

파이썬 3, 87 84 바이트

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

온라인으로 사용해보십시오!



@cairdcoinheringaahing 78 바이트 .
Jonathan Frech

0

자바 (ES6) 161 157 바이트

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

자바 스크립트 / ES6, 90 바이트

방금 거친 솔루션을 작성했으며 엄청난 56 바이트로 기존 JS 답변을 이겼습니다. 그런 다음 11 바이트를 떨어 뜨 렸습니다.

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

여기 데모가 있습니다.

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.