Визначення того, чи зупиняється машина Тюрінга, невідомо, але це не обов’язково для простих машин.
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 кроків.