打印分层蛋糕


14

挑战

给定输入后nn从侧面看,打印一个高ASCII的艺术蛋糕,上面放着两个蜡烛。有关详细信息,请参见以下示例。

输出量

>> cake(1)

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

>> cake(3)

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

...等等。

规则

  • 禁止标准漏洞
  • 请尝试一个聪明的解决方案
  • 这是,因此最短答案以字节为单位。但是,将不会选择答案。

玩得开心!

Answers:


6

Python 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

如果需要,您应该能够更改为Python 2并更改int(input())input()print语句,另外还可以将四个空格更改为一个(如果是制表符,请将其更改为一个空格以使其更明显地表明它是一个字符) 。另外由于某种原因,您的字节数太高了4。
仅ASCII的

@Mars Ultor糟糕,是的,我不确定为什么我选择python 3作为开始。谢谢。
edelbitter's

您可能还可以使用格式%的节省了几个字节
ASCII-仅

4

Ruby,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%+

比Python短?一定是有问题的...


3

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

Haskell,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个字符!
这里肯定有打高尔夫球的空间。

在线尝试!

请注意,这确实会打印所有偏移一个空格的内容。


欢迎来到编程难题和Code Golf!非常好的第一答案:)
Adnan

1
也许字符串乘法会有所帮助,这就是×命令。是一个有关如何使用它的示例。
阿德南

@Adnan确实有帮助!谢谢!
路加福音

2

Python 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

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

它不是很聪明,但是我以前从未做过其中之一。(编辑:删除了不必要的括号;又减少了一个字符)


欢迎来到该网站,并且是一个不错的第一答案!
詹姆斯

2

Pyth,73个字节

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

一个程序,该程序在STDIN上输入整数并打印结果。

这里可能仍然会有打高尔夫球的事情。

在线尝试

稍后说明


1

JavaScript(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:该死的我忘了这次。10个字节的开销$argv。:-/
Titus

1

Vimscript,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.1227 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

Excel VBA,139 130 127个字节

匿名VBE立即窗口,该窗口从单元格获取输入A1并将蛋糕输出到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个字节

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个连字符。


0

C(gcc) 158个 153字节

-5个字节,感谢ceilingcat。

i,l,s;p(c,s){printf("%*c%*.*s%c\n",i-~i,c,l,l,s,c);}f(n){s=memset(malloc(5*n),45,5*n);l=1;for(i=n;i--;p('|',""))l+=4,n+~i?p(43,s):p(32,"_|_|_");p(43,s);}

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.