2つの時間ディメンションでのプログラミング


17

この世界にたった1つの時間次元があるのはおかしい事故ですが、そうである必要はありません。2つ以上の時間ディメンションを持つ世界を想像するのは簡単です。これらの世界では、この世界のように、コンピューターを構築してソフトウェアを実行できます。

システム

これは、2つの時間ディメンションでBrainf * ckプログラムを実行するためのシステムです。

2つの時間ディメンションはxとyです。各Brainf * ckプログラムは、x半プログラムとy半プログラムで構成されます。たとえば、プログラムは

x: +>+
y: [-]

2つのハーフプログラムにはそれぞれ独自のプログラムポインターがありますが、1つのテープポインターを共有します(つまり、両方がテープの同じセルで動作します)。

時間は2次元なので、モーメントのグリッドで構成されます。

時間の3x3グリッド、xおよびyアクションによる接続

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

@JanDvorakああ、私はあなたが尋ねているものを見ると思う。各プログラムを追加するのを忘れて、その次元の隣接する瞬間から命令ポインターを取得します。それを編集し、(+>)を実行して、あなたと同じ結果が得られるかどうかを確認します。
オーウェン

これはいい挑戦ですが、答えをランク付けするためには客観的な勝利基準が必要です。
マーティンエンダー

3
挑戦はまだ私には本当に明確ではありません。グリッドの時間はどのくらい正確に進みますか。あなたのグラフィックによると、またはの(1,1)いずれかを介して到達できるようですが、1つのプログラムで開始し、1つで開始すると、相対的な順序が問題になりますか?(1,0)(0,1)>+
マーティンエンダー

回答:


8

合計4バイト:([-]>

そのような最小のプログラムを見つけるために、ブルートフォーサー書きました

このプログラムの実際の図を以下に示します。このグリッドは、仕様のグリッドと同様の方法で配置され、左下隅が(0,0)、x軸がx時間、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つ:

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

右上隅はあなたがリストしたものとは異なることに注意してください。私のコードは私が試した他のすべての例と一致するため、これはあなたの例のエラーだと思います。


これは素晴らしいです!エラーについては正しいかもしれません。もう一度確認します。
オーウェン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.