Stackylogic to język programowania oparte na logice wymyśliłem, że biorą w 0
„s i 1
” s dla wejścia i wyjścia jednego 0
lub 1
po zakończeniu.
Program Stackylogic składa się z wierszy, które mogą zawierać tylko trzy znaki, 01?
a także dokładnie jeden <
na końcu jednego z wierszy. Linie nie mogą być puste, a linia z <
musi mieć co najmniej jednego 0
, 1
lub ?
przed nim.
Oto przykładowy program, który (jak wyjaśnię) oblicza NAND dwóch bitów:
1
?<
11
?
0
Każda linia w programie Stackylogic jest uważana za stos , z dolną po lewej stronie i górną po prawej stronie. Domniemany jest pusty stos (pusta linia) przed pierwszą linią w programie i po ostatniej linii.
<
, Które będziemy nazywać się kursor , znaki stos rozpocząć się, gdy program jest uruchamiany Stackylogic. Wykonanie programu Stackylogic przebiega następująco:
Usuń górną postać ze stosu, na który wskazuje obecnie kursor.
- Jeśli znakiem jest
?
, poproś użytkownika o znak a0
lub a1
i postępuj tak, jakby to był znak. - Jeśli znak jest
0
, przesuń kursor o jeden stos w górę (do linii powyżej bieżącej linii). - Jeśli znak jest
1
, przesuń kursor o jeden stos w dół (do linii poniżej bieżącej linii).
- Jeśli znakiem jest
Jeśli stos, do którego przesuwa się kursor, jest pusty, wypisz ostatnią wartość, która została usunięta ze stosu (zawsze a
0
lub1
) i zakończ program.W przeciwnym razie, jeśli stos, na który przesuwa się kursor, nie jest pusty, wróć do kroku 1 i powtórz proces.
Zauważ, że programy Stackylogic zawsze kończą się, ponieważ ostatecznie muszą wyczerpać swoje stosy.
Przykład NAND
W programie NAND kursor zaczyna się od ?
:
1
?<
11
?
0
Zakładamy, że dane wprowadzone przez użytkownika zostaną 1
raz wyświetlone ?
, co oznacza, że kursor przesunie się w dół, dzięki czemu program będzie wyglądał następująco:
1
11<
?
0
Teraz równina 1
znajduje się na górze stosu kursora. Jest należycie wysunięty, a kursor znów się porusza:
1
1
?<
0
Załóżmy teraz, że dane wejściowe użytkownika 0
dla ?
, co oznacza, że kursor przesunie się w górę:
1
1<
0
Znów a 1
znajduje się na stosie kursora, więc kursor wysuwa się i przesuwa w dół:
1
<
0
Na koniec stos kursorów jest pusty, więc wyświetlana jest ostatnia wartość, to 1
, i program się kończy.
Jest to poprawne dla bramki NAND, ponieważ 1 NAND 0
jest 1
. To oczywiście działa na pozostałe trzy dwubitowe wejścia, jeśli chcesz to sprawdzić.
LUB Przykład
Ten program Stackylogic symuluje bramkę OR :
?
?<
Łatwo zauważyć, że początkowe wejście 1
popchnie kursor do domyślnego pustego stosu poniżej ostatniego wiersza, kończąc program i wyprowadzając to, 1
co właśnie zostało wprowadzone.
Z 00
drugiej strony, kursor dojdzie do niejawnego pustego stosu u góry, kończąc program i wysyłając ostatni 0
do wprowadzenia.
Wyzwanie
Napisz program lub funkcję, która pobiera program Stackylogic jako ciąg znaków i uruchamia go, drukując lub zwracając wynikowe 0
lub 1
.
Po ?
, możesz poprosić użytkownika o wprowadzenie 0
lub 1
wejście, lub odczytać wartość ze wstępnie ustawionego ciągu 0
„i 1
”, który również bierzesz jako dane wejściowe. (Może to być kolejny ciąg znaków do twojego programu / funkcji lub możesz po prostu założyć, że pierwszy lub ostatni wiersz łańcucha programu będzie strumieniem wejściowym).
Możesz założyć, że program jest zawsze dobrze sformułowany. Opcjonalnie możesz założyć, że programy wejściowe mają pojedynczy znak nowej linii (pamiętaj jednak, że na końcu zawsze jest ukryty pusty stos).
Najkrótszy kod w bajtach wygrywa.
Więcej przykładowych programów
ZERO
0<
ONE
1<
BUFFER
?<
NOT
1
?<
0
AND
?<
?
NAND
1
?<
11
?
0
OR
?
?<
NOR
1
?
00
?<
0
XOR(v1)
?
0
1?<
?
0
XOR(v2)
?
?<
11
?
0
XNOR(v1)
1
?
0?<
1
?
XNOR(v2)
1
?
00
?<
?
MEDIAN(v1)
1
???<
0
MEDIAN(v2)
?
1?<
??
1\???<\0
.
111\???????<\000
.
?\1?<\??
. Alternatywnie, oto symetryczna implementacja 5-liniowa:?\?0\?<\?1\?