> <> , 106 104 bajtów
Mam wrażenie, że> <> może nie być najlepszym językiem do tego, ale zaszedłem za daleko, aby się poddać i nie opublikować tego. *Na koniec linii 4 ma być przestrzenią. Nie podoba ci się, jak niesamowicie groteskowy jest ten kod? Wypróbuj online .
<v?(0:i
v>~" ## "}}l:::
>"#"o1-:?!v02.>~a"#"oo
"-2ooa"#"~<.31v!?:-1o"
7v?=3loroo"#"a<.4
.>";^"e3pa2p093
Oto wersja bez zmieniaczy kierunku, aby dać wyobrażenie o tym, jak porusza się wskaźnik (zwróć uwagę, że pominąłem instrukcje „teleportacji” .).
Kierunek przepływu:
<v
v>
> v >
< v
v <
>
Wyjaśnienie
Moja wizualizacja stosu będzie oparta na danych wejściowych input. > <> jest językiem dwuwymiarowym, więc zwróć uwagę na to, gdzie wskaźnik przesuwa się między liniami, ponieważ wykonuje kod pod nim (w tym kodzie <>v^służą głównie do zmiany kierunku). Zacznę wyjaśnienia od miejsca, w którym zaczyna się wskaźnik. Zauważ, że powtórzą się dwie linie, gdy wskaźnik przesunie się do tyłu po piątej linii.
To, co zawsze uważam za fajne w> <>, to możliwość modyfikowania własnego kodu źródłowego i korzystam z niego w tym programie. Linie 3 i 4 są ponownie używane do drukowania ostatnich dwóch wierszy poprzez modyfikację znaku w każdym z nich.
Wiersz 1: Pętla wejściowa
<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
Stos: [-1,t,u,p,n,i]
Wiersz 2: generuje trzeci wiersz wyniku
v>~" ## "}}l:::
>~" ## "}} remove -1 (default input value) from stack and pads with # and spaces
l::: push 4 lengths of padded input
Stos: [9,9,9,9,#, ,t,u,p,n,i, ,#]
Wiersz 3: drukuje pierwszy wiersz wyniku
>"#"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
Stos: [0,9,9,9,#, ,t,u,p,n,i, ,#]
Wydajność:
#########
Wiersz 4: drukuje drugi wiersz wyniku
"-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 "
Stos: [0,9,9,#, ,t,u,p,n,i, ,#]
Dane wyjściowe ( *reprezentuje spację):
#########
#*******
Wiersz 5: drukuje trzeci wiersz wyniku
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
Stos: [9,9,0]
Wydajność:
#########
# #
# input #
Wiersz 6: Ustawia się do drukowania czwartego i piątego wiersza wydruku
.>";^"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
Stos: [0,9,9,0]
Wiersz 4: wydrukuj czwarty wiersz wyniku
"-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
Stos: [0,9,0]
Dane wyjściowe ( *reprezentuje spację):
#########
# #
# input #
#*******
Wiersz 3: wydrukuj ostatni wiersz wyniku
"#"o1-:?!;02.>~a"#"oo
>~a"#"oo pop top of stack, print "#", newline
"#"o1-:?!;02. print "#" until top of stack is 0, then terminate
Stos: [0,0]
Wydajność:
#########
# #
# input #
# #
#########