众所周知,确定Turing机器是否停止运行还不确定,但是对于较简单的机器而言并不一定如此。
甲富机是一台具有有限带,其中在磁带上的每个小区具有整数或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步骤之后停止。