これは@ ais523の答えをさらに発展させたもので、ブラケットを2セットのみに減らし、Golombルーラー理論に基づいたよりコンパクトなセル配置を使用しています。ais523がいるこの建設のためのコンパイラを作っただけでなく、このTIOセッションは TWMカウンタのデバッグ・トレースを実行しているBFプログラムを得られた試料を示します。
オリジナルと同様に、これはウォーターフォールモデルのプログラムから始まり、一般性を失わない制限がいくつかあります。
- すべてのカウンターは同じ自己リセット値R持っています。つまり、TWMトリガーマップfは、すべてのx f(x,x)=Rというプロパティがありますx。
- 停止カウンターhが1つありますhます。
- カウンターの数cは、ある素数pに対して(p−1)/2p。
ゴロム定規
Erdős–Turán構造とWelch–Costas配列の置換関数を組み合わせて、必要なプロパティを持つGolombルーラーを取得します。
(この結合された構造は新しいアイデアではないはずですが、Wikipediaからこれらの2つの部分を見つけて組み合わせました。)
ましょうrの原始根でありp=2c+1。関数を定義する
g(k )= 4 c k − ((rk− 1 )mod (2 c + 1 ))、k = 0 、… 、2 c − 1。
- gは次数 2 cのゴロム定規です。すなわち、差分 G (I )- G (jは)異なる数のすべての対に対して一意である I 、J ∈ { 0 、... 、2 C - 1 }。2 cg(i )− g(j )i,j∈{0,…,2c−1}
- g(k)mod(2c)は、すべての値0,…,2c−1回だけ取ります。
テープ構造
各TWMカウンタのx∈{0,…,c−1}、我々は、2つのBFテープセル位置を割り当てる代替セルを u(x)と値セル v(x):
u(x)=g(k1)<v(x)=g(k2) with u(x)≡v(x)≡x(modc)
gの2番目の特性により、選択できる正確に2つの異なるk1,k2値があります。
フォールバックセルのコンテンツは、ほとんどの場合0ままになります。ただし、カウンターがちょうどアクセスされたとき、2 Rになるときを除きます。2Rとき、カウンターの自己リセット値の2倍になります。値セルは、対応するTWMカウンターの値の2倍に保たれます。
BFプログラムの実行(有限数)で到達できる他のすべてのセルは、奇数値に保たれるため、常にゼロ以外としてテストされます。初期化後、これは自動的に行われます。これは、すべてのセル調整が均等に行われるためです。
必要に応じて、初期のBFテープ位置の左側への移動を避けるために、すべてのセル位置を定数だけ右にシフトできます。
BFプログラムの構造
LET H=v(h)−u(h)停止カウンタの値と代替セル間の距離であり、およびlet N数十分に大きなものであるcN+1≥v((x+1)modc)−u(x)すべてのカウンターx。次に、基本的なBFプログラム構造は
初期化 [
>
×(H+cN+1) [
<
×c ]
調整 <
×H ]
初期化
初期化の最後のカウンターがちょうど訪問していたし、ちょうどアクティブセルがそのフォールバックセルであるかのように、位相状態で、それらの初期値にプログラムによって到達可能なすべてのセルを設定し、u(c−1):
- 値セルは、カウンター0が事前にデクリメントされることを除いて、対応するTWMカウンターの初期コンテンツの2倍に初期化されます。
- フォールバックセルは0に設定されますが、セルu(c−1)は2R設定されます。
- プログラムが到達可能な他のすべてのセル(有限数)は1設定されます。
次に、プログラムの最初に到達する前に、テープポインターを位置u(c−1)−H(常にゼロ以外のセル)に移動し[
ます。
外側のループの始まり
外側のループの反復の開始時に、テープポインターはいずれかのuになりますu(x)−H、カウンター xに対して(x )− Hまたはv(x)−Hx。
ましょうy=((x+1)modc)訪問に次のカウンタです。
移動>
×(H+cN+1)の位置にテープポインタを置き≡y(modc)v(y)左側ではない。
内側のループ[
<
×c ]
は、cステップで左方向にゼロセルを検索します。カウンターyの場合yがゼロの、(ゼロ)値のセルv(y)停止します。それ以外の場合、フォールバックセルu(y)が見つかります。
見つかったセルが新しいアクティブセルになります。
調整
調整段階は、アクティブセルに対するそれらの位置に基づいて、テープ上の様々な細胞を調節します。このセクションには+-><
コマンドため、これらの調整は無条件に行われます。ただし、すべてのカウンター関連セルはGolombルーラーパターンであるため、現在のアクティブセルに適切ではない調整はすべての重要なセルを見逃し、代わりに無関係なセルを調整します(奇数のまま)。
したがって、アクティブセルの自己調整を除き、アクティブセルと調整済みセルの考えられる必要なペアごとに個別のコードをプログラムに含める必要があります。ただし、調整は相対位置のみに基づいているため、すべてのセルで共有する必要があります。
必要な調整は次のとおりです。
- 前のカウンターのフォールバックセルを調整する u(x)を−2Rます。
- 現在のカウンターのフォールバックセルu(y)を2調整します2R、除いて現在のアクティブセルがある場合v(h)と、我々は停止しなければならないので。
- 次のカウンターの値セルv((y+1)modc)を−2(カウンターをデクリメント)だけ調整します。
- アクティブセルが値セルv(y)(カウンターyがゼロに達した)の場合、すべての値セルv(z)をTWMトリガーマップから2f(y,z)だけ調整します。v(y)自体は2Rによって調整されます。
上記第一および第二の調整は、すべてのアクティブセルが調整しなければならないという事実によって必要作られ自体で同じ値で2R値の細胞について、したがってまたフォールバック細胞について。これには、フォールバックセルを準備およびクリーンアップして、値ブランチとフォールバックブランチの両方で確実に0に戻す必要があります。
外側のループの終わり
ムーブメント <
×Hは、調整フェーズの終わりに、テープポインターがアクティブセルの左側にH移動することを表します。
停止カウンターの値cell v (h )以外のすべてのアクティブセルの場合、これは無関係なセルであるため、奇数でゼロ以外であり、外側のループは別の繰り返しを続けます。v(h)
以下のためにv(h)、ポインタではなく、その対応する代替セル上に配置されるu(h)我々はそれがゼロに保つために、上記の例外を作っているため、プログラムは終了最終的な貫通]
と停止します。