この世界にたった1つの時間次元があるのはおかしい事故ですが、そうである必要はありません。2つ以上の時間ディメンションを持つ世界を想像するのは簡単です。これらの世界では、この世界のように、コンピューターを構築してソフトウェアを実行できます。
システム
これは、2つの時間ディメンションでBrainf * ckプログラムを実行するためのシステムです。
2つの時間ディメンションはxとyです。各Brainf * ckプログラムは、x半プログラムとy半プログラムで構成されます。たとえば、プログラムは
x: +>+
y: [-]
2つのハーフプログラムにはそれぞれ独自のプログラムポインターがありますが、1つのテープポインターを共有します(つまり、両方がテープの同じセルで動作します)。
時間は2次元なので、モーメントのグリッドで構成されます。
x次元に沿って移動すると、xハーフプログラムは1つのタイムステップを実行します。y次元に沿って移動すると、yハーフプログラムは1つのタイムステップを実行します。
したがって、たとえば、テープが[0] 0 0([]テープポインタを表す)として始まり、x / yプログラムが+andであるとしましょう->-。このプログラムの実行は次のようになります。
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ハーフプログラムは同じ時間を繰り返します。これは、時間が経過しないためです。
各瞬間のテープには、そこにフィードされるすべてのアクションの累積効果が含まれます(各アクションは1回カウントされます)。したがって、たとえば、時間(2、1)のテープには次の累積効果が含まれます。
- (0、0)からのx-action
- (1、0)からのx-action
- (0、1)からのxアクション
- (1、1)からのx-action
- (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のように、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    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
矢印付きの図
次の図は、アクションとテープの計算方法を示しています。
パズル
2次元Brainf * ckプログラム(xハーフプログラムとyハーフプログラム)を作成して、次の両方の条件を満たす3セルテープで実行します。
- テープがとして開始する場合、[0] 0 0時間(05、5)にゼロ番目のセルにあります。
- テープがとして開始する場合、[1] 0 0時間(05、5)にゼロ番目のセルにあります。
要件を満たす最短のプログラムが勝ちます。
+、>)を実行して、あなたと同じ結果が得られるかどうかを確認します。
                (1,1)いずれかを介して到達できるようですが、1つのプログラムで開始し、1つで開始すると、相対的な順序が問題になりますか?(1,0)(0,1)>+
                


+とは>?それが1 1 [0](かなりクレイジーですが、仕様が示唆しているように見える)場合、命令ポインターはどのように結合しますか?2つのスレッドが+and[]である場合1 2、データテープではになります[3]が、2番目の命令ポインターはループ内([]+パス)か、外部([+]パス)か、さらには不正(+[]?)ですか?