Как известно, определение того, останавливается ли машина Тьюринга, неразрешимо, но это не обязательно верно для более простых машин.
Foo машина представляет собой машину с конечной лентой, где каждая ячейка на ленте имеет целое число или символ HALT h
, например ,
2 h 1 -1
Указатель инструкции начинается с указания на первую ячейку:
2 h 1 -1
^
На каждом шаге указатель инструкции перемещается вперед на число, на которое он указывает, а затем отрицает это число. Итак, после одного шага, он будет двигаться вперед 2
клетки и превратить 2
в -2
:
-2 h 1 -1
^
Машина Foo продолжает делать это, пока указатель инструкции не укажет на символ остановки ( h
). Итак, вот полное выполнение этой программы:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
Лента также является круглой, поэтому, если указатель инструкций перемещается с одной стороны ленты, он переходит на другую сторону, например:
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
Одна интересная вещь об этих машинах Foo - то, что некоторые не останавливаются, например:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
Эта программа будет продолжаться в тех четырех последних состояниях навсегда.
Итак, напишите программу, которая определяет, останавливается ли машина Foo или нет! Вы можете использовать любой (разумный) формат ввода, который вам нравится для машин Foo, и вы можете использовать его 0
в качестве символа остановки. Вы можете использовать любые два разных выхода для случая, когда он останавливается, и для случая, когда он не останавливается. Ваша программа, конечно, должна выводить ответ за ограниченное время для всех допустимых входных данных.
Это код-гольф , поэтому постарайтесь сделать свою программу максимально короткой!
Контрольные примеры
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
(не останавливается)
3 2 1 1 4 h
. Это останавливает, но требует больше итераций, чем удвоенное количество элементов.
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
останавливается после 786430 шагов.