In một lớp bánh


14

Thử thách

Đưa ra một đầu vào n, in một nlớp bánh nghệ thuật ASCII cao, nhìn từ bên cạnh, với hai cây nến trên đầu. Tham khảo các ví dụ dưới đây để biết chi tiết.

Đầu ra

>> cake(1)

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

>> cake(3)

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

...và như thế.

Quy tắc

  • Lỗ hổng tiêu chuẩn bị cấm
  • Hãy cố gắng ở một giải pháp thông minh
  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng. Tuy nhiên, câu trả lời sẽ không được chọn.

Chúc vui vẻ!

Câu trả lời:


6

Python 2, 238 ký tự

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

Ví dụ còn thiếu của Bánh 2:

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

Xin Chào và Chào Mừng đến với trang! Bạn có thể lấy đầu vào từ STDIN và lấy ra 24 ký tự. Ví dụ:i=int(input())
DJMcMayhem

Nếu bạn muốn, bạn sẽ có thể thay đổi thành Python 2 và thay đổi int(input())thành input()printcâu lệnh, ngoài ra bạn có thể thay đổi bốn khoảng trắng thành một (nếu đó là một tab, hãy thay đổi nó thành một khoảng trắng để làm rõ hơn rằng đó là một ký tự) . Thêm vào đó, số tiền của bạn là 4 quá cao vì một số lý do.
ASCII - chỉ

@Mars Ultor oops, vâng, tôi không chắc tại sao tôi chọn python 3 để bắt đầu. Cảm ơn.
edelbitter

Bạn cũng có thể lưu một vài byte bằng định dạng phần trăm
ASCII

4

Ruby, 109 107 byte

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

Mẻ, 233 byte

@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%+

Ngắn hơn Python? Có gì đó không ổn ...


3

JavaScript (ES6), 134 byte

Một chiếc bánh đệ quy.

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)

Bản giới thiệu

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

Haskell, 103 byte

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

Xác định hàm gtrả về danh sách các chuỗi chứa các dòng của đầu ra


2

05AB1E, 115 , 101 ký tự

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

Lưu được 14 ký tự nhờ Adnan!
Chắc chắn một số phòng để chơi golf ở đây.

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

Lưu ý rằng điều này không in mọi thứ được bù bởi một khoảng trắng.


Chào mừng bạn đến với Câu đố lập trình và Code Golf! Câu trả lời đầu tiên rất hay :)
Adnan

1
Có thể nhân chuỗi giúp, đó là ×lệnh. Đây là một ví dụ về cách nó được sử dụng.
Ad Nam

@Ad Nam Điều đó có ích! Cảm ơn!
Lu-ca

2

Python 2, 122 byte

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

Python 3, 162 ký tự

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)

Nó không thông minh lắm, nhưng tôi chưa bao giờ thực hiện một trong những điều này trước đây. (Chỉnh sửa: xóa các dấu ngoặc đơn không cần thiết; giảm thêm một ký tự)


Chào mừng đến với trang web, và câu trả lời đầu tiên tốt đẹp!
DJMcMayhem

2

Bình thường, 73 byte

+K*dtyQ"_|_|_"+tK"|     |"jP.iJms[*\ yt-Qd\+*+5*4d\-\+)+StQtQmXd"+-""| "J

Một chương trình lấy đầu vào của một số nguyên trên STDIN và in kết quả.

Có lẽ vẫn còn một số golf để được thực hiện ở đây.

Dùng thử trực tuyến

Giải thích sau


1

JavaScript (ES6), 171 byte

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`
`

Vượt qua đầu tiên, có lẽ không tối ưu ...


1

PHP, 150 147 138 136 130 140 byte

cách tiếp cận mới:

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

phiên bản cũ để tham khảo:

$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),"
";

Tôi tò mò; Làm thế nào để đọc đầu vào này?
Lynn

@Lynn: chết tiệt, tôi đã quên rằng lần này.10 byte chi phí cho $argv. : - /
Tít

1

Vimscript, 116 115 byte

Khá lộn xộn nhưng nó hoạt động!

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

Để gọi nó: call A(3)trong một bộ đệm trống . Để tải chức năng,source cake.vim

Giải trình

  • 2i+<Esc>5i-<Esc> viết dòng đầu tiên +-----+
  • o||<Esc>5i<Space><Esc>thêm | |vào dòng thứ hai
  • Vkyjply4lpjy4hpđược lưu trong macro @z- nó trực quan chọn cả hai dòng, sắp xếp chúng, dán chúng bên dưới và thêm 4 dấu gạch ngang và khoảng trắng cho chúng.
  • #@zlặp lại #lần này
  • ddl4x xóa các dòng cuối cùng và loại bỏ các dấu gạch ngang xuống dưới cùng của bánh để làm cho nó bằng với lớp trên cùng của lớp dưới cùng
  • ggd$i_|_|_ thay thế dòng đầu tiên bằng đầu bánh
  • %ceSau đó, trung tâm toàn bộ bánh đến chiều rộng của lớp dưới cùng! !

1

SOGL V0.12 , 27 26 byte

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

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

Giải trình:

∫               }           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 Excel, 139 130 127 byte

Cửa sổ ngay lập tức VBE ẩn danh lấy đầu vào từ ô A1và xuất bánh sang cửa sổ ngay lập tức 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

QBasic, 115 byte

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

Ung dung

In dòng trên cùng với nến; sau đó in hai dòng bánh còn lại cùng một lúc.

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

SPC, khi được sử dụng trong một PRINTcâu lệnh, sẽ phát ra số lượng khoảng trắng đã cho. Thuận tiện, khi đưa ra một đối số phủ định, nó coi nó là 0, vì vậy thực tế indent - 2-2trong lần lặp cuối cùng không phải là vấn đề. STRING$lấy số đếm và mã ký tự (ở đây, 45 cho -) và lặp lại ký tự đó với số lần. Ở đây, chúng ta phải đặc biệt dòng cuối cùng (khi i=n) ngắn hơn 4 dấu gạch ngang so với dòng khác.


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.