Надрукуйте шаруватий торт


14

Виклик

З огляду на nдрук, роздрукуйте nвисокі шари тортів 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())
Джеймс

Якщо ви хочете, ви повинні мати можливість перейти на Python 2 та змінити int(input())на input()і printоператор, плюс ви можете змінити чотири пробіли на один (якщо це вкладка, змініть її на пробіл, щоб зробити більш очевидним, що це один символ) . Плюс ваш рахунковий рахунок чомусь занадто високий.
Лише ASCII

@Mars Ultor, на жаль, я не впевнений, чому я вибрав python 3 для початку. Спасибі.
едельбітер

Можливо, ви також зможете зберегти кілька байт, використовуючи відсоткове форматування
лише для ASCII,

4

Рубі, 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'-?}'+,

Збережено 14 символів завдяки Аднану!
Однозначно, тут є місце для гри в гольф.

Спробуйте в Інтернеті!

Зауважте, що це надрукує все, зміщене одним пробілом.


Ласкаво просимо до головоломки програмування та коду для гольфу! Дуже приємна перша відповідь :)
Аднан

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

Пітон 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. : - /
Тит

1

Вимскрипт, 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

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

SPC, коли використовується в PRINTоператорі, видає задану кількість пробілів. Зручно, коли йому надають негативний аргумент, він трактує це як 0, тому факт, що indent - 2знаходиться -2в останній ітерації, не є проблемою. STRING$приймає рахунок і символьний код (тут, 45 для -) і повторює символ стільки разів. Тут ми маємо окремий випадок, коли останній рядок (коли i=n) на 4 дефіси коротший, ніж це було б інакше.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.