レイヤードケーキを印刷する


14

チャレンジ

input nを指定すると、ASCIIアートケーキnレイヤーを横から見た高さで印刷し、上に2本のろうそくを載せます。詳細については、以下の例を参照してください。

出力

>> cake(1)

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

>> cake(3)

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

...等々。

ルール

  • 禁止されている標準的な抜け穴
  • 賢い解決策を試みてください
  • これはであるため、バイト単位の最短回答が優先されます。ただし、答えは選択されません。

楽しんで!

回答:


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

Cake 2の欠けている例:

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

こんにちは、サイトへようこそ!STDINから入力を取得し、24文字を削除できます。例:i=int(input())
DJMcMayhem

必要に応じて、Python 2に変更int(input())input()printステートメントに変更できるようになります。さらに、4つのスペースを1つに変更できます(タブの場合は、スペースに変更して1文字であることを明確にします)。 。さらに、何らかの理由でバイト数が4を超えています。
ASCIIのみ

@Mars Ultorおっと、はい、なぜPython 3を選択したのかわかりません。ありがとう。
エーデルビッター

また、パーセントの書式を使用して、いくつかのバイトを保存することができるかもしれ
ASCIIのみの

4

Ruby、109 107バイト

->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文字を節約できました!
ここには間違いなくゴルフの余地がある。

オンラインでお試しください!

これは、1つのスペースでオフセットされたすべてを印刷することに注意してください。


プログラミングパズルとコードゴルフへようこそ!非常に良い最初の答え:)
アドナン

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)

それはあまり賢くありませんが、私はこれらのいずれかを以前にやったことがありません。(編集:不要な括弧を削除、もう1文字削減)


サイトへようこそ、最初の答えはいいです!
DJMcMayhem

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:くそー、この時間を忘れてしまった$argv。:-/
タイタス

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>| |2行目に追加します
  • 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のバイト

セルから入力を受け取り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

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

非ゴルフ

キャンドルで一番上の行を印刷します。次に、残りのケーキを一度に2行ずつ印刷します。

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.