二维编程


17

这个世界碰巧只有一个时间维度,这是一个有趣的意外,但不一定非要如此。很难想象具有2个或更多时间维度的世界,在这些世界中,您可以构建计算机并在其上运行软件,就像在这个世界中一样。

系统

这是一个用于在两个时间维度上运行Brainf * ck程序的系统:

两个时间维度是x和y。每个Brainf * ck程序都包含一个x半程序和一个ay半程序,例如,一个程序可以是

x: +>+
y: [-]

两个半程序都有各自的程序指针,但是它们共享一个磁带指针(即,它们都在磁带的同一单元上操作)。

时间是二维的,因此它由时刻网格组成:

3 x 3时间网格,通过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在第零个单元格中有一个。

符合要求的最短程序将获胜。


只是为了验证:运行+and 的结果是>什么?如果是1 1 [0](非常疯狂,但是这似乎是规范所建议的),指令指针如何组合?如果两个线程是+and [],那么在1 2数据磁带上将是[3],但是第二条指令指针是在循环([]+路径)内部,还是在外部([+]路径)甚至是非法(+[])?
John Dvorak

@JanDvorak啊,我想我明白您的要求了。我忘了添加每个程序从其尺寸的相邻时刻获取其指令指针。我将对其进行编辑,然后尝试运行(+>)以查看是否获得与您相同的结果。
Owen

这是一个很好的挑战,但需要一个客观的获胜标准才能对答案进行排名。
Martin Ender

3
对我来说,挑战仍然不是很清楚。时间如何精确地穿过网格。根据您的图形,看来我可以(1,1)通过(1,0)或到达(0,1),但它一个程序以开头,一个程序以>开头+,那么确定它们的相对顺序很重要吗?
Martin Ender

Answers:


8

总共4个字节:([-]>

写了一个蛮力工具来找到最小的此类程序。

这是该程序的运行图。网格的排列方式与规范中的网格类似,左下角为(0,0),沿x轴的x时间为y轴,沿时间y的时间为y。右上角包含结果。

首先,用以下胶带0 0 0

|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

现在带1 0 0

|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|  1 ( 0)  0 |  1   0 ( 0)|( 0)  0   0 |  0 ( 0)  0 |  0   0 ( 0)|( 0)  0   0 
|([)-]       |[-]         |[-]         |[-]         |[-]         |[-]         
|>           |>           |>           |>           |>           |>           
+------------+------------+------------+------------+------------+------------
|( 1)  0   0 |( 1)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 |( 0)  0   0 
|([)-]       |[(-)]       |[-(])       |[-]         |[-]         |[-]         
|(>)         |(>)         |(>)         |(>)         |(>)         |(>)         
+------------+------------+------------+------------+------------+------------

规范中没有明确说明几件事,例如3格胶带缠绕的事实。


作为奖励,这里是(的可视化>+[-])例如:

|( 0)  0   0 |( 0)  0   0 |( 1)  1   0 
|(>)+        |>(+)        |>+          
|[-]         |[-]         |[-(])       
+------------+------------+------------
|( 0)  0   0 |  0   0 ( 0)|  0   1 ( 1)
|(>)+        |>(+)        |>+          
|[-]         |[-]         |[(-)]       
+------------+------------+------------
|( 0)  0   0 |  0 ( 0)  0 |  0 ( 1)  0 
|(>)+        |>(+)        |>+          
|([)-]       |([)-]       |([)-]       
+------------+------------+------------

和(中的一个>++>)例如:

|( 1)  0   0 |  1   1 ( 0)|  1   3 ( 1)
|(>)+        |>(+)        |>+          
|+(>)        |+(>)        |+(>)        
+------------+------------+------------
|( 0)  0   0 |  0 ( 0)  0 |  0 ( 1)  0 
|(>)+        |>(+)        |>+          
|(+)>        |(+)>        |(+)>        
+------------+------------+------------

请注意,右上角与您列出的内容不同,我认为这是您的示例中的错误,因为我的代码与我尝试过的所有其他示例均匹配。


这真太了不起了!您可能对错误是正确的。我会再次检查。
欧文
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.