Spirala , wynik: 61921 5127 4715 4655 4191
4.X~>v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X * X X X X X X X X X X X X X X X X X X X X X X X X X
! > h y t f V b n j u [ ( 1 3 2 ) ] U J N B F T Y H G
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*vvv****v+^v+^v+^v+^*v++4
X X X X X X X X X X X X X X X X X X X X X X X X X X
v v v v v v v v v v v v v v v v v v v v v v v v v v
Y y J F V u t U [ G H B n 3 N 2 j ) h g f ] ( 1 b T
Tłumacz można znaleźć tutaj .
Wyjaśnienie:
P.X~ZZ*v+^#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X X X X X X X X X X X X X X X X X X X X X X X X X X
! h y t f V b n j u r d c m k i e s x l o w a z p q
0;vgv*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*v*****************************************************************vP
X X X X X X X X X X X X X X X X X X X X X X X X X X
v v v v v v v v v v v v v v v v v v v v v v v v v v
z y x w V u t s r q p o n m l k j i h g f e d c b a
Program rozpoczyna się od 0
znaku w czwartej linii. Pierwszy fragment kodu do uruchomienia to 0;vg
. ;
pobiera liczbę jako dane wejściowe i umieszcza ją na stosie. v
umieszcza to, co jest w rejestrze (zero) na stosie. Będzie używany jako licznik. g
jest etykietą, gdy zostanie osiągnięta, formant przeskakuje do innego wystąpienia litery g
w kodzie.
Oto, gdzie jest teraz kontrola:
X
v
g
Ponieważ we wszystkich innych kierunkach jest spacja, wskaźnik instrukcji zaczyna się przesuwać w górę.
v
umieszcza zero na stosie i X
natychmiast wyskakuje ze stosu. Ponieważ wyświetlana wartość wynosi zero, wskaźnik instrukcji przesuwa się na X
(w przeciwnym razie traktowałby to jako spację).
Domyślnie przepływ sterowania jest w trybie skrętu w prawo, więc teraz, gdy dotrze do skrzyżowania, wskaźnik instrukcji skręca w prawo. v
jeszcze raz wypycha zero do stosu, *
zwiększa rejestr o jeden.
v*v*v
X
v
g
Następnie v
umieszcza w stosie zawartość rejestru (numer 1), wskaźnik instrukcji próbuje obrócić się w prawo, uderzając w następny X
. Wartość właśnie dodana do stosu jest usuwana i umieszczana w rejestrze. Ponieważ jest niezerowy, X
nie jest wprowadzany, a adres IP przechodzi do następnego *
po prawej stronie, ponownie zwiększając wartość w rejestrze.
v*v*v*v*v
X X X X X
v v v v v
i h g f e
Dzieje się to raz za razem, dopóki nie dojdziemy do końca tej części i nie *
rozpocznie się linia s. Do tej pory wartość w rejestrze wynosi 6, czyli litera g
ASCII minus litera ASCII a
. Zatem za pomocą linii 97 *
s zwiększamy wartość rejestru do 103, która odpowiada literze, g
którą chcemy wydrukować. v
wpycha go do stosu i P
jest kolejną etykietą po uderzeniu, którą przeskakujemy do drugiej P
w pierwszym wierszu kodu.
Tutaj .
wyskakuje wartość ze stosu i drukuje ją jako znak. Następnie X
wyskakuje zewnętrzne zero ze stosu, a następnie ~
porównuje dwie pozostałe wartości na stosie (wartości to licznik i wartość wejściowa). Jeśli wartości są takie same, operator umieszcza zero na stosie (w przeciwnym razie -1 lub 1). Znów kontrola próbuje skręcić w prawo. X
wyświetla wartość porównania ze stosu, jeśli wynosi zero X
, a po jej !
wprowadzeniu kończy działanie programu.
P.X~ZZ*v+^
X
!
W przeciwnym razie adres IP przechodzi do Z
, który jest etykietą, która w tym przypadku przeskakuje tylko jeden krok w prawo. Powodem tego jest to, że przeskakiwanie ustawia wartość w rejestrze z powrotem na zero. *
inkrementuje rejestr i v
umieszcza wynikowy 1 w stosie. +
wysuwa dwa górne elementy stosu (1 i licznik), dodaje je i umieszcza wynik na stosie (w efekcie licznik zwiększa się o jeden). ^
kopiuje wynik ze stosu do rejestru bez usuwania go ze stosu.
#
zmniejsza wartość w rejestrze o jeden, v
wypycha zmniejszoną wartość na stos, adres IP próbuje skręcić w prawo, a X
wyskakuje wartość ze stosu. Jeśli wartość jest niezerowa, IP przesuwa się na wschód, zmniejszając wartość w rejestrze, aż osiągnie zero, a IP wejdzie do X
gałęzi.
#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v#v
X X X X X X X X X X X X X X X X X X X X X X X X X
h y t f V b n j u r d c m k i e s x l o w a z p q
Gałąź prowadzi do etykiety odpowiadającej wartości licznika. Po uderzeniu w etykietę kontrolka przeskakuje do innego wystąpienia etykiety w sekcji, w której zaczynaliśmy od etykiety g
, rozpoczynając kolejną iterację. Podobnie jak w przypadku g
, wartość w rejestrze jest zwiększana do wartości ASCII litery, którą musimy wydrukować. Następnie znak jest drukowany, a licznik zwiększany, wybierana jest kolejna etykieta. Dzieje się tak, dopóki po ostatniej iteracji licznik nie zrówna się z wejściem, a program się kończy.
Edytować:
P.X~Zv+^
X *
! Z
Osiąga to samo, co
P.X~ZZ*v+^
X
!
ale z mniejszą ilością białych znaków.
Edycja 2:
vv****v+^v+^v+^v+^*v++P
Może być używany zamiast:
*****************************************************************vP