Maszyna
Maszyna typu kule bilardowe składa się tylko z symboli \
_
/
wraz z dużymi i małymi literami, spacjami oraz liczbą 1
.
\
i /
są rampami. Piłka wychodząca z góry zostanie odbita odpowiednio na prawą lub lewą stronę. W przypadku obu ramp, jeśli piłka wychodzi z dowolnej strony, zostanie odchylona w dół.
_
jest elementem logicznym. Wykonywana przez nią logika jest najbardziej niestabilną częścią komputera. Po pierwsze, piłka nadchodząca z lewej lub prawej strony kontynuuje w tym samym kierunku. Piłka wychodząca z góry zostanie zatrzymana. Następnie, po zakończeniu jego wykonywania (patrz Uruchamianie maszyny poniżej), jeśli liczba piłek przekraczających / lądujących na niej jest dodatnią liczbą parzystą, wówczas pojedyncza kula jest wypuszczana z dolnej części elementu.
Przestrzeń nic nie robi. Wszelkie piłki pochodzące z dowolnego kierunku spadają prosto w dół z powodu grawitacji.
Małe litery to dane wejściowe. Wszystkie wejścia będą albo pojedynczym 1, albo 0.
Wielkie litery są wyjściami. Liczba wyjściowa będzie liczbą bilardowych kulek, które trafiły w jego lokalizację.
Liczba 1
wypuszcza dodatkową piłkę bilardową w tym miejscu. Reprezentuje logiczną 1.
Wszystkie postacie poza tym \_/
powodują, że każda piłka nadchodząca z dowolnego kierunku spada prosto w dół z powodu grawitacji.
Kulki nigdy się nie łączą, nie dzielą ani nie zderzają. Są tworzone tylko po zwolnieniu z wejścia, a _
lub a 1
. Są niszczone tylko wtedy, gdy spadną prosto na _
.
Przykładowa maszyna
1 a
\_/ b
\_/
\/
/\ /
_ _
A B
Nigdy nie będzie żadnych pustych linii w maszynie, ale _
mogą sprawiać wrażenie, że jest pusta linia.
Uruchamianie maszyny
Maszyna działa w warstwach lub rzędach. Wszystkie ruchy kule bilardowej na górnej warstwie są wykonywane, zanim cokolwiek stanie się na drugiej warstwie.
Maszyna
ab
\_A
C
jest uruchamiany w następujący sposób:
Najpierw monituje o wprowadzenie danych a
w formularzu a:
. Użytkownik wprowadzi następnie 1 lub 0 (a następnie Enter). Powtarza to dla danych wejściowych b
. To jest koniec pierwszej warstwy. Zakładam, że użytkownik wprowadził 1 dla obu danych wejściowych.
Następnie wykrywa ścieżkę pierwszej piłki (od a
), która biegnie wzdłuż \
, przez _
, do A
i spada do miejsca pod A
. Następnie wykrywa ścieżkę drugiej piłki (z b
), która biegnie prosto w dół _
i kończy. To koniec drugiej warstwy.
Teraz, przed trzecią warstwą, ponieważ _
ma na sobie dwie kule, wypuszcza jedną piłkę. Wyjście A
ma nad sobą jedną kulę, więc wyprowadza A:1
.
W przypadku trzeciej warstwy śledzi ścieżkę pierwszej piłki (od _
), która przechodzi przez C
i spada prosto w dół. Druga piłka (która wpadła przez A
) również spada prosto w dół.
Teraz, przed czwartą warstwą, ponieważ wynik C
miał jedną kulkę nad nią, wyprowadza C:1
.
Ponieważ czwarta warstwa jest pusta, program się kończy.
Całkowity wynik powinien wyglądać
a:1 (the user entered the one)
b:1 (same here)
A:1
C:1
Cel
Twoim celem jest pobranie maszyny ze STDIN i jej symulacja poprzez pobranie danych wejściowych i wydruków w razie potrzeby do STDOUT. Pierwsza część danych wejściowych do programu będzie składała się z maszyny, która ma być uruchomiona, a następnie będzie pusta linia. Wszelkie napotkane litery wejściowe powinny powodować wyświetlanie przez program monitów o wprowadzenie danych w formie nazwy wejściowej, po której następuje dwukropek. Każde wyjście powinno być pokazane w postaci nazwy wyjścia, dwukropka, a następnie liczby kulek przechodzących nad tym miejscem.
To jest golf.
Przykłady
Przecięcie drutu
ab
\/
AB
Brama XOR
ab1
\_/
C
Pełny sumator
1 a
\_/ b
\_/
\/
/\
_ __/
\_/
\/c
\\_/
_S1
\ \/
__/
/
_
\__
C
\_/
?