레이어 케이크 인쇄


14

도전

주어진 입력 nn , 측면에서 볼 때 2 개의 양초가 있는 ASCII 아트 케이크 층을 높이 인쇄하십시오 . 자세한 내용은 아래 예를 참조하십시오.

산출

>> cake(1)

 _|_|_
|     |
+-----+

>> cake(3)

     _|_|_
    |     |
  +---------+
  |         |
+-------------+
|             |
+-------------+

...등등.

규칙

  • 표준 허점 금지
  • 영리한 해결책을 시도하십시오
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다. 그러나 답변은 선택되지 않습니다.

즐기세요!

답변:


6

파이썬 2, 238 자

i=input()
m=["+"+"-"*(i*4+1)+"+","|"+" "*(i*4+1)+"|"]
for v in range(i,1,-1):
 m+=[" "*(i-v)*2+"+"+"-"*(v*4+1)+"+"," "*(i-v+1)*2+"|"+" "*((v-1)*4+1)+"|"]
m.pop()
m+=[" "*(i-1)*2+"|"+" "*5+"|"," "*(i-1)*2+" _|_|_"]
print'\n'.join(m[::-1])

케이크 2의 빠진 예 :

   _|_|_
  |     |
+---------+
|         |
+---------+

안녕하세요, 사이트에 오신 것을 환영합니다! STDIN에서 입력을 취하고 24자를 제거 할 수 있습니다. 예를 들어i=int(input())
James

당신이 원하는 경우에, 당신은 파이썬 2로 변경할 수 변경해야 int(input())하는 input()print문, 당신 플러스 (더 분명 그것은 하나 개의 문자입니다 있는지 확인하기 위해,이 탭의 경우 공간으로 변경) 하나에 네 개의 공간을 변경할 수 있습니다 . 또한 어떤 이유로 바이트 수가 4가 너무 높습니다.
ASCII 전용

@ Mars Ultor oops, 그렇습니다. 파이썬 3을 왜 선택했는지 모르겠습니다. 감사.
edelbitter

퍼센트 형식을 사용하여 몇 바이트를 저장할 수도 있습니다
ASCII 전용

4

루비, 109107 바이트

->n{p=->t{puts t.center 3+4*n}
p['_|_|_']
(1..n).map{|i|p[?|+' '*(1+4*i)+?|]
p[?++?-*((i<n ?5:1)+4*i)+?+]}}

3

배치, 233 바이트

@echo off
set i=
for /l %%j in (2,1,%1)do call set i=  %%i%%
echo %i% _^|_^|_
set s=-----
for /l %%j in (2,1,%1)do call:l
echo ^|%s:-= %^|
echo +%s%+
exit/b
:l
echo %i%^|%s:-= %^|
set i=%i:~2%
set s=----%s%
echo %i%+%s%+

파이썬보다 짧은? 뭔가 잘못되었을 것입니다 ...


3

자바 스크립트 (ES6), 134 바이트

재귀 케이크.

f=(n,i=--n,r=(n,c)=>'- '[+!c].repeat(n),p=r((i-n)*2),j=n*4+5,x=p+`+${r(j,1)}+
`)=>(n?f(n-1,i)+x:p+` _|_|_
`)+p+`|${r(j)}|
`+(n-i?'':x)

데모

let f=(n,i=--n,r=(n,c)=>'- '[+!c].repeat(n),p=r((i-n)*2),j=n*4+5,x=p+`+${r(j,1)}+
`)=>(n?f(n-1,i)+x:p+` _|_|_
`)+p+`|${r(j)}|
`+(n-i?'':x)

console.log(f(4))


3

하스켈, 103 바이트

f(a:b)n=a:([0..4*n]>>b)++[a]
x!n=x:[f"| "n,f"+-"n]
g 1=" _|_|_"!1
g n=map("  "++)(init.g$n-1)++f"+-"n!n

g출력 행을 포함하는 문자열 목록을 리턴 하는 함수 를 정의합니다.


2

05AB1E, 115 , 101 자

>UXð×?" _|_|_",Xð×?"|     |",X<U0<VXGNVXY-ð×?'+?8Y·+G'-?}'+,XY-ð×?'|?7Y·+ð×?'|,}XY-ð×?'+?8Y·+G'-?}'+,

Adnan 덕분에 14 문자를 절약했습니다!
확실히 골프를위한 여지가 있습니다.

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

이것은 한 칸씩 오프셋 된 모든 것을 인쇄합니다.


프로그래밍 퍼즐과 코드 골프에 오신 것을 환영합니다! 아주 좋은 첫 번째 답변 :)
Adnan

1
문자열 곱셈이 도움이 될 수 ×있습니다. 이것이 명령입니다. 이것이 어떻게 사용되는지에 대한 예입니다.
Adnan

@Adnan 그것은 도움이됩니다! 감사!
누가

2

파이썬 2, 122 바이트

a='  '*input()
b='+-+'
c=d=' '
while a:b='+----'+b[1:];c=d*4+c;a=a[2:];print a+[' _|_|_',b][c>d*5]+'\n%s|%%s|'%a%c
print b

2

파이썬 3, 162 자

p=print
t=int(input())
d=4*'-'
s='  '
a='+\n'
r=(t-1)*s
p(r+' _|_|_\n'+r+'|     |')
for i in range(2,t+1):b=(t-i)*s;p(b+'+-'+i*d+a+b+'| '+i*2*s+'|')
p('+-'+t*d+a)

그다지 영리하지는 않지만 전에는 한 번도 해본 적이 없습니다. (편집 : 불필요한 괄호를 제거하고 문자를 하나 더 줄였습니다)


사이트에 오신 것을 환영합니다.
제임스


1

자바 스크립트 (ES6), 171 바이트

n=>[(s="  "[R='repeat'](n-1))+" _|_|_",s+"|     |",...Array(n-1),`+${"-"[R](n*4+1)}+`].map((_,i)=>_||(s="  "[R](n-i))+`+${"-"[R](i=i*4+1)}+`+`
${s}|${" "[R](i)}|`).join`
`

첫 번째 패스, 아마도 최적은 아닙니다 ...


1

PHP, 150 (147) 138 136 130 140 바이트

새로운 접근 방식:

echo$p=str_pad("",-2+2*$n=$argv[1])," _|_|_";for($x="    ",$b=$y="----";$n--;){$a.=$x;if($n)$b.=$y;echo"
$p| $a|
",$p=substr($p,2),"+-$b+";}

참고로 구버전 :

$p=str_pad;for($o=["_|_|_"];$i++<$n=$argv[1];$o[]="+".$p("",($i<$n)*4+$e,"-")."+")$o[]="|".$p("",$e=$i*4+1)."|";foreach($o as$s)echo$p($s,$n*4+3," ",2),"
";

궁금해; 이 입력을 어떻게 읽습니까?
Lynn

@Lynn :이 시간을 잊어 버렸습니다 $argv. :-/
Titus

1

vim 스크립트, 116 115 바이트

꽤 지저분하지만 작동합니다!

fu A(n)
let @z="Vkyjply4lpjy4hp"
exe "norm 2i+\e5i-\eo||\e5i \e".a:n."@zddl4xggd$i_|_|_"
exe "%ce ".(a:n*4+3)
endfu

를 호출하려면 : call A(3) 버퍼 . 함수를로드하려면source cake.vim

설명

  • 2i+<Esc>5i-<Esc> 첫 줄을 쓴다 +-----+
  • o||<Esc>5i<Space><Esc>| |두 번째 줄에 추가
  • Vkyjply4lpjy4hp매크로에 저장됩니다 @z-시각적으로 두 줄을 모두 선택하고, 잡아 당기고, 아래에 붙여 넣고 4 개의 대시와 공백을 추가합니다.
  • #@z#시간을 반복
  • ddl4x 마지막 줄을 삭제하고 케이크 맨 아래의 대시를 제거하여 맨 아래 레이어의 상단과 동일하게 만듭니다.
  • ggd$i_|_|_ 첫 번째 줄을 케이크 상단으로 바꿉니다.
  • %ce그런 다음 케이크 전체를 바닥층의 너비에 맞 춥니 다! !

1

SOGL V0.12 , 27 26 바이트

∫4*I:┌*╗1Ο;@*┐1Ο}⁴¹k┐╔2ΟΚ╚

여기 사용해보십시오!

설명:

∫               }           for each in 1..input inclusive, pushing counter
 4*                           multiply by 4
   I                          increase by 1
    :                         duplicate; this will be used later
     ┌*                       repeat a dash pop times
       ╗1Ο                    encase them in plusses
          ;                   get the duplicate on the stacks top
           @*                 repeat a space pop times
             ┐1Ο              encase in vertical bars
                 ⁴          duplicate the item below ToS - the last line
                  ¹         wrap the stack in an array
                   k        remove the arrays first item
                    ┐       push "_"
                     ╔      push "|"
                      2Ο    encase 2 copies of the vertical bar in underscores
                        Κ   and prepend that to the array
                         ╚  center the array horizontally

0

엑셀 VBA, 139 (130) 127 바이트

셀에서 입력을 받고 A1케이크를 VBE 즉시 창으로 출력하는 익명 VBE 즉시 창

For i=1To[A1]:s=Space(2*([A1]-i)):x=String(1+4*i,45):?s &IIf(i=1," _|_|_","+" &x &"+"):?s"|"Replace(x,"-"," ")"|":Next:?s"+"x"+


0

Q 기본, 115 바이트

INPUT n
?SPC(n*2-1)"_|_|_
FOR i=1TO n
s=n*2-i*2
?SPC(s)"|"SPC(i*4+1)"|
?SPC(s-2)"+"STRING$(i*4+(i=n)*4+5,45)"+
NEXT

언 골프

촛불로 맨 위 줄을 인쇄하십시오. 그런 다음 케이크의 나머지 부분을 한 번에 두 줄씩 인쇄하십시오.

INPUT n
PRINT SPC(n * 2 - 1); "_|_|_"
FOR i = 1 TO n
  indent = n * 2 - i * 2
  PRINT SPC(indent); "|"; SPC(i * 4 + 1); "|"
  PRINT SPC(indent - 2); "+"; STRING$(i * 4 + (i = n) * 4 + 5, 45); "+"
NEXT

SPCPRINT문 에서 사용될 때 지정된 수의 공간을 방출합니다. 음의 인수를 주어 졌을 때 사실 때문에 편리하게, 그것은 0으로 처리 indent - 2하다 -2마지막 반복에서이 문제가되지 않습니다. STRING$카운트 및 문자 코드 (여기서는 45 -)를 사용하여 해당 횟수만큼 문자를 반복합니다. 여기서 우리는 마지막 줄 ( i=n)을 다른 경우보다 4 개의 하이픈으로 짧게 만들어야합니다.


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