Распечатать слоеный пирог

14

Вызов

С учетом входных данных nнапечатайте художественные nслои торта ASCII высотой, если смотреть со стороны, с двумя свечами сверху. См. Примеры ниже для деталей.

Выход

>> cake(1)

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

>> cake(3)

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

...и так далее.

правила

  • Стандартные лазейки запрещены
  • Пожалуйста, попробуйте умное решение
  • Это , поэтому выигрывает самый короткий ответ в байтах. Однако ответ не будет выбран.

Веселиться!

dkudriavtsev
источник

Ответы:

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:

   _|_|_
  |     |
+---------+
|         |
+---------+
edelbitter
источник
Здравствуйте и добро пожаловать на сайт! Вы можете взять вход от 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)+?+]}}
м-chrzan
источник
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%+

Короче чем питон? Что-то должно быть не так ...

Нил
источник
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))

Arnauld
источник
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 символов благодаря Аднану!
Определенно, здесь есть место для игры в гольф.

Попробуйте онлайн!

Обратите внимание, что это печатает все смещение на один пробел.

Люк
источник
Добро пожаловать в Программирование головоломок и Code Golf! Очень хороший первый ответ :)
Аднан
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)

Это не очень умно, но я никогда не делал этого раньше. (Изменить: убраны лишние скобки; уменьшены еще на один символ)

Zoetrophy
источник
Добро пожаловать на сайт и приятного первого ответа!
Джеймс
2

Pyth, 73 байта

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

Программа, которая принимает ввод целого числа в STDIN и печатает результат.

Здесь, вероятно, еще предстоит сыграть в гольф.

Попробуйте онлайн

Объяснение позже

TheBikingViking
источник
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`
`

Первый проход, наверное, не оптимальный ...

ETHproductions
источник
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),"
";
Titus
источник
Мне любопытно; как это читать вход?
Линн
@ Линн: блин, я забыл, что на этот раз 10 байтов $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>добавляет | |на второй строке
  • 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
dzaima
источник
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

Ungolfed

Распечатать верхнюю строку со свечами; затем напечатайте оставшуюся часть торта двумя строками за раз.

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 дефиса короче, чем она была бы в противном случае.

DLosc
источник
0

C (gcc) , 158 153 байта

-5 байт благодаря потолку.

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

Попробуйте онлайн!

gastropner
источник