この世界にたった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
時間(0
5、5)にゼロ番目のセルにあります。 - テープがとして開始する場合、
[1] 0 0
時間(0
5、5)にゼロ番目のセルにあります。
要件を満たす最短のプログラムが勝ちます。
+
、>
)を実行して、あなたと同じ結果が得られるかどうかを確認します。
(1,1)
いずれかを介して到達できるようですが、1つのプログラムで開始し、1つで開始すると、相対的な順序が問題になりますか?(1,0)
(0,1)
>
+
+
とは>
?それが1 1 [0]
(かなりクレイジーですが、仕様が示唆しているように見える)場合、命令ポインターはどのように結合しますか?2つのスレッドが+
and[]
である場合1 2
、データテープではになります[3]
が、2番目の命令ポインターはループ内([]+
パス)か、外部([+]
パス)か、さらには不正(+[]
?)ですか?