> <> , 106 104 байта
У меня такое ощущение, что> <> может быть не лучшим языком для этого, но я зашел слишком далеко, чтобы сдаться и не публиковать это. В *
конце строки 4 предполагается пробел. Тебе не нравится, как невероятно гротескно выглядит этот код? Попробуйте онлайн .
<v?(0:i
v>~" ## "}}l:::
>"#"o1-:?!v02.>~a"#"oo
"-2ooa"#"~<.31v!?:-1o"
7v?=3loroo"#"a<.4
.>";^"e3pa2p093
Вот версия, в которой нет ничего, кроме смены направления, чтобы дать представление о том, как движется указатель (обратите внимание, что я пропустил операторы "teleport", т.е. .
).
Направление потока:
<v
v>
> v >
< v
v <
>
объяснение
Моя визуализация стека будет основана на вводе input
. > <> - это двумерный язык, поэтому обратите внимание на то, где указатель перемещается между строками, так как он выполняет код под ним (в этом коде <>v^
в основном используются для изменения направления). Я начну свои объяснения, откуда начинается указатель. Обратите внимание, что повторятся две строки, так как указатель перемещается назад после пятой строки.
Что мне всегда нравится в <>, так это его способность изменять собственный исходный код, и я использую его в этой программе. Строки 3 и 4 используются повторно для печати последних двух строк путем изменения символа в каждой.
Строка 1: входной цикл
<v?(0:i
< change direction to left
(0:i checks if input is less than 0 (no input defaults to -1)
v? change direction to down if so
стек: [-1,t,u,p,n,i]
Строка 2: генерирует третью строку вывода
v>~" ## "}}l:::
>~" ## "}} remove -1 (default input value) from stack and pads with # and spaces
l::: push 4 lengths of padded input
стек: [9,9,9,9,#, ,t,u,p,n,i, ,#]
Строка 3: печатает первую строку вывода
>"#"o1-:?!v02.>~a"#"oo
>"#"o print "#"
1- subtract 1 from length (it's at the top of the stack)
:?!v move down if top of stack is 0
стек: [0,9,9,9,#, ,t,u,p,n,i, ,#]
Выход:
#########
Строка 4: печатает вторую строку вывода
"-2ooa"#"~<.31v!?:-1o"*
-2ooa"#"~< pops 0, prints newline, "#", then decrements length by 2
" o"* prints space (* is supposed to be space char)
-1 decrements top of stack
.31v!?: changes direction to down if top of stack is 0, else jumps back to "
стек: [0,9,9,#, ,t,u,p,n,i, ,#]
Выход ( *
представляет пространство):
#########
#*******
Строка 5: печатает третью строку вывода
7v?=3loroo"#"a<.4
oo"#"a< prints "#",newline
r reverses stack
7v?=3lo .4 outputs until stack has 3 values, then changes direction to down
стек: [9,9,0]
Выход:
#########
# #
# input #
Строка 6: настраивается для печати четвертой и пятой строк вывода
.>";^"e3pa2p093
>";^" push ";",then "^"
e3p place "^" as the fifteenth character on line 4
a2p place ";" as the eleventh character on line 3
0 push a value (value doesn't matter -- it will be deleted)
. 93 jump to the tenth character on line 4
стек: [0,9,9,0]
Строка 4: печать четвертой строки вывода
"-2ooa"#"~<.31^!?:-1o"*
ooa"#"~< delete 0 (unnecessary value pushed), then print newline,"#"
-2 subtract two from value on top of stack (length)
" .31^!?:-1o"* print space until top of stack is 0, then change direction to up
стек: [0,9,0]
Выход ( *
представляет пространство):
#########
# #
# input #
#*******
Строка 3: печать последней строки вывода
"#"o1-:?!;02.>~a"#"oo
>~a"#"oo pop top of stack, print "#", newline
"#"o1-:?!;02. print "#" until top of stack is 0, then terminate
стек: [0,0]
Выход:
#########
# #
# input #
# #
#########