Ustalenie, czy maszyna Turinga zatrzymuje się, jest dobrze znane jako nierozstrzygalne, ale niekoniecznie dotyczy to prostszych maszyn.
Urządzenie Foo jest maszyną o skończonej taśmy, w którym każda komórka na taśmie ma całkowitą lub symbol, powstrzymanie h
, np
2 h 1 -1
Wskaźnik instrukcji zaczyna się od wskazania pierwszej komórki:
2 h 1 -1
^
Na każdym kroku wskaźnik instrukcji przesuwa się do przodu o liczbę, na którą wskazuje, a następnie neguje tę liczbę. Tak więc, po jednym kroku, przesuwałby 2
komórki do przodu i zmieniał 2
w -2
:
-2 h 1 -1
^
Maszyna Foo robi to dalej, dopóki wskaźnik instrukcji nie wskaże symbolu zatrzymania ( h
). Oto pełna realizacja tego programu:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
Taśma jest również okrągła, więc jeśli wskaźnik instrukcji przesunie się z jednej strony taśmy, przejdzie na drugą stronę, np .:
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
Jedną interesującą rzeczą w tych maszynach Foo jest to, że niektóre się nie zatrzymują, np .:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
Ten program będzie kontynuował zapętlanie w tych czterech ostatnich stanach na zawsze.
Napisz więc program, który określa, czy maszyna Foo zatrzymuje się, czy nie! Możesz użyć dowolnego (rozsądnego) formatu wejściowego, który ci się podoba dla maszyn Foo, i możesz użyć go 0
jako symbolu zatrzymania. Możesz użyć dowolnych dwóch różnych danych wyjściowych dla przypadku, w którym się zatrzymuje, i przypadku, w którym się nie zatrzymuje. Twój program musi oczywiście udzielić odpowiedzi w skończonym czasie na wszystkie prawidłowe dane wejściowe.
To jest golf golfowy , więc postaraj się, aby twój program był jak najkrótszy!
Przypadki testowe
2 h 1 -1
Halts
3 h 1 3
Halts
h
Halts
1 1 1 1 h
Halts
2 1 3 2 1 2 h
Halts
3 2 1 1 4 h
Halts
1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
Halts
2 h
Does not halt
1 2 h 2
Does not halt
8 1 2 3 3 4 8 4 3 2 h
Does not halt
1 2 4 3 h 2 4 5 3
Does not halt
3 1 h 3 1 1
Does not halt
1 2 h 42
Does not halt
1 2 h 42
(nie zatrzymuje się)
3 2 1 1 4 h
. Ten zatrzymuje się, ale wymaga więcej iteracji niż dwukrotność liczby elementów.
1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
który zatrzymuje się po 786430 krokach.