这个世界碰巧只有一个时间维度,这是一个有趣的意外,但不一定非要如此。很难想象具有2个或更多时间维度的世界,在这些世界中,您可以构建计算机并在其上运行软件,就像在这个世界中一样。
系统
这是一个用于在两个时间维度上运行Brainf * ck程序的系统:
两个时间维度是x和y。每个Brainf * ck程序都包含一个x半程序和一个ay半程序,例如,一个程序可以是
x: +>+
y: [-]
两个半程序都有各自的程序指针,但是它们共享一个磁带指针(即,它们都在磁带的同一单元上操作)。
时间是二维的,因此它由时刻网格组成:
沿x维度移动,x半程序执行一个时间步。沿y维移动,y半程序执行一个时间步。
因此,例如,假设磁带以[0] 0 0
([]
表示磁带指针)开始,而x / y程序为+
和->-
。该程序的执行如下所示:
x y tape x-action y-action
0 0 [ 0] 0 0 + at 0 - at 0
1 0 [ 1] 0 0 (done) - at 0
0 1 [-1] 0 0 + at 0 move >
1 1 [ 0] 0 0 (done) move >
注意,随着时间沿y方向移动,x半程序不断重复执行相同的操作,因为它的时间没有进行。
磁带在每时每刻都包含馈入其中的所有操作的累积效果(每个操作计数一次)。因此,例如,磁带在时间(2,1)包含以下累积作用:
- 来自(0,0)的x动作
- 来自(1,0)的x动作
- 来自(0,1)的x动作
- 来自(1,1)的x动作
- 从(0,0)开始的y动作
- 来自(1,0)的y动作
- 来自(2,0)的y动作
累计手段:
- 一个单元格的所有增量和减量加在一起。
- 磁带指针向左(-1)和向右(+1)的所有移动相加。
指令指针不累积。每个半程序从其尺寸的前一时刻获取其指令指针。即,x程序指针仅在x维度上前进,而y程序指针仅在y维度上前进。因此,例如,在从中开始的程序([]
,+
)中[0] 0 0
,执行将是
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 0 0 0 + at 0 0 0
1 0 0 0 0 + at 0 2 (from jump) 0
0 1 1 0 0 0 1
1 1 2 0 0 1 (from NO jump) 1
从上面的(一些更多的时刻+
,->-
)仿真是:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 + at 0 - at 0 0 0
1 0 [ 1] 0 0 - at 0 1 0
2 0 [ 1] 0 0 - at 0 1 0
0 1 [-1] 0 0 + at 0 > 0 1
1 1 [ 0] 0 0 > 1 1
2 1 [-1] 0 0 > 1 1
0 2 -1 [ 0] 0 + at 1 - at 1 0 2
1 2 0 1 [ 0] - at 2 1 2
2 2 [-1] 1 0 - at 0 1 2
允许的Brainf * ck运算符如下(它们具有其标准含义):
+
,-
:增加,减少;[
,]
:循环直到零(按照标准Brainf * ck 处理a[
或]
花费一个时间步长);<
,>
:在录像带上左右移动。
复杂的例子
对于程序(>
,+
)开始[0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 > + at 0 0 0
1 0 0 [ 0] 0 + at 1 1 0
0 1 [ 1] 0 0 > 0 1
1 1 1 1 [ 0] 1 1
对于(+
,-
)开始[0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 + at 0 - at 0 0 0
1 0 [ 1] 0 0 - at 0 1 0
0 1 [-1] 0 0 + at 0 0 1
1 1 [ 0] 0 0 1 1
请注意,带子两端的[0] 0 0
,因为每一个+
和-
发生两次,总结为0。
对于程序(>+
,[-]
)开始[0] 0 0
:
x y tape x-action y-action x-prog-ptr y-prog-ptr
0 0 [ 0] 0 0 > 0 0
1 0 0 [ 0] 0 + at 1 1 0
2 0 0 [ 1] 0 2 0
0 1 [ 0] 0 0 > 0 3
1 1 0 0 [ 0] + at 2 1 3
2 1 0 1 [ 1] - at 2 2 1
0 2 [ 0] 0 0 > 0 3
1 2 [ 0] 0 0 + at 0 1 3
2 2 [ 1] 1 0 2 2
带有箭头的图
下图显示了如何计算动作和磁带:
难题
编写一个在三个单元格的磁带上运行的2D Brainf * ck程序(带有一个x半程序和一个ay半程序),它同时满足以下两个条件:
- 如果磁带以开头
[0] 0 0
,在时间(5,5),则0
在第零个单元格中有一个。 - 如果磁带以开头
[1] 0 0
,在时间(5,5),则0
在第零个单元格中有一个。
符合要求的最短程序将获胜。
+
,>
)以查看是否获得与您相同的结果。
(1,1)
通过(1,0)
或到达(0,1)
,但它一个程序以开头,一个程序以>
开头+
,那么确定它们的相对顺序很重要吗?
+
and 的结果是>
什么?如果是1 1 [0]
(非常疯狂,但是这似乎是规范所建议的),指令指针如何组合?如果两个线程是+
and[]
,那么在1 2
数据磁带上将是[3]
,但是第二条指令指针是在循环([]+
路径)内部,还是在外部([+]
路径)甚至是非法(+[]
)?