Katmanlı bir pasta yazdırın


14

Meydan okuma

Bir giriş verildiğinde , yandan bakıldığında, üstte iki mum bulunan nbir ASCII sanat pastası nkatmanı yazdırın . Ayrıntılar için aşağıdaki örneklere bakın.

Çıktı

>> cake(1)

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

>> cake(3)

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

...ve bunun gibi.

kurallar

  • Standart boşluklar yasaktır
  • Lütfen akıllı bir çözüm deneyin
  • Bu , bayt en kısa cevap kazanır. Ancak cevap seçilmeyecektir.

İyi eğlenceler!

Yanıtlar:


6

Python 2,238 karakter

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'nin eksik örneği:

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

Merhaba, siteye hoş geldiniz! STDIN'den girdi alıp 24 karakter çıkarabilirsiniz. Örneğin,i=int(input())
James

Eğer isterseniz, Python 2'ye değiştirmek mümkün ve değişim olmalı int(input())etmek input()ve printaçıklamada, artı (daha belirgin o bir karakter şekilde çalışıp, bir sekme ise bir boşluk olarak değiştirin) birine dört boşluk değiştirebilir . Ayrıca, bayt hesabınız bir nedenle 4 çok yüksek.
Sadece ASCII

@ Mars Ultor Hata, evet, neden başlamak için python 3'ü seçtiğimden emin değilim. Teşekkürler.
edelbitter

Yüzde biçimlendirmesini kullanarak da birkaç bayt kaydedebilirsiniz
yalnızca ASCII-sadece

4

Yakut, 109107 bayt

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

Toplu, 233 bayt

@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'dan daha mı kısa? Bir şeyler yanlış olmalı ...


3

JavaScript (ES6), 134 bayt

Özyinelemeli bir pasta.

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)

gösteri

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 bayt

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Çıktının satırlarını içeren dizelerin listesini döndüren bir işlevi tanımlar


2

05AB1E, 115 , 101 karakter

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

Adnan sayesinde 14 karakter kurtardı!
Burada golf için kesinlikle bazı oda.

Çevrimiçi deneyin!

Bunun, her şeyi tek bir boşlukla dengelediğini unutmayın.


Programlama Bulmacaları ve Kod Golf hoş geldiniz! Çok güzel ilk cevap :)
Adnan

1
Belki dize çarpma yardımcı olur, hangi ×komut. Bu nasıl kullanıldığına bir örnektir.
Adnan

@Adnan Bu yardımcı oluyor! Teşekkürler!
Luke

2

Python 2, 122 bayt

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 karakter

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)

Çok zekice değil, ama daha önce hiç bunlardan birini yapmadım. (Düzenle: gereksiz parantez kaldırıldı; bir karakter daha azaltıldı)


Siteye hoş geldiniz ve güzel bir ilk cevap!
James

2

Pyth, 73 bayt

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

STDIN üzerinde bir tam sayı girdisi alan ve sonucu basan bir program.

Muhtemelen burada yapılması gereken bazı golf var.

Çevrimiçi deneyin

Açıklama sonra gelecek


1

JavaScript (ES6), 171 bayt

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

İlk geçiş, muhtemelen optimal değil ...


1

PHP 150 147 138 136 130 140 bayt

yeni yaklaşım:

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

referans için eski sürüm:

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

Merak ediyorum; bu girişi nasıl okuyor?
Lynn

@Lynn: lanet olsun bu sefer unuttum. 10 bayt yükü $argv. : - /
Titus

1

Vimscript, 116 115 bayt

Oldukça dağınık ama işe yarıyor!

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

Diyoruz için: call A(3)bir in boş tampon. İşlevi yüklemek için,source cake.vim

açıklama

  • 2i+<Esc>5i-<Esc> ilk satırı yazar +-----+
  • o||<Esc>5i<Space><Esc>| |ikinci satıra ekler
  • Vkyjply4lpjy4hpmakroya kaydedilir @z- her iki çizgiyi görsel olarak seçer, onları çeker, altına yapıştırır ve 4 çizgi ve boşluk ekler.
  • #@zbu #kez tekrar eder
  • ddl4x son çizgileri siler ve alt katmanın üst kısmına eşit hale getirmek için pastanın alt kısmına tire işareti ekler
  • ggd$i_|_|_ ilk satırı pastanın tepesiyle değiştirir
  • %cesonra tüm pastayı alt katmanın genişliğine ortalar! !

1

SOGL V0.12 , 27 26 bayt

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

Buradan Deneyin!

Açıklama:

∫               }           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 Bayt

Hücreden girdi alan A1ve VBE anında penceresine bir pasta çıkaran anonim VBE anında penceresi

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 bayt

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

Ungolfed

Üst çizgiyi mumlarla yazdırın; sonra pastanın geri kalanını bir seferde iki satır yazdırın.

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, bir PRINTifadede kullanıldığında , verilen sayıda boşluk yayar. Negatif bir argüman verildiğinde gerçeği böylece Elverişli, bu, 0 olarak davranır indent - 2olan -2son yineleme bir sorun değildir. STRING$bir sayı ve bir karakter kodu alır (burada, 45 için -) ve bu sayıyı defalarca tekrarlar. Burada, son satırın (ne zaman i=n) aksi halde olacağından daha kısa 4 tire olması gerekir.


0

C (gcc) , 158153 bayt

Tavan kedisi sayesinde -5 bayt.

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

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.