利点は明らかです:オーバーフローがないので、長い演算の必要がないので、任意の長さの配列などで等しく作業できます。 しかし、すぐに、セル( "[-]")をクリアするお気に入りの方法が機能しないことがわかります。セルに負の値があった場合、プログラムはループします。 同様に、コピーコマンド「[-> + <]」を自由に使用することはできません。これは、負でない数に対してのみ機能します。
プログラミング中に、セルの内容の兆候を注意深く監視する必要があることがわかり(最も簡単な方法は、負の数の出現を防ぐことです)、兆候が不明な数字が表示された場合、特別な方法でそれを操作します
ここでは、2つのタスクを検討します。最初に、演算子「if(a> b)C; else D;” aとbは負ではなく、CとDはいくつかのアクションです。次に、任意の数値の符号をゼロにし、コピーし、決定する方法を学習します。
条件付きステートメント。
そのため、テープには2つの非負の数aとbが書き込まれます(このセルで自分で選択します)。 これらの数値を比較し、結果に応じてアクションCまたはDのいずれかを実行する必要があります。使用されたすべてのセル(aおよびbが配置されたセルを含む)をリセットする必要があります。
この形式で演算子を書き直します。
hは1です。 while(h){ if(a == 0){D; a = b = 1; hは0です。 } if(b == 0){C; a = b = 1; hは0です。 } a--; b--; }
aとbが負でない場合、そのようなプログラムでは負の数を使用できません。 if(a == 0)B;演算子を実装するには テープ上に4つのセル「a 0 1 0」のブロックを作成し、コマンド「[>] >> [B>]」を実行します。 最初にキャリッジがブロックの最初のセルにあった場合、いずれの実施形態でも最後にキャリッジはその4番目のセルにあります。
プログラムは次のようになります(キャリッジと数値「a」はセル0にあり、数値「b」はセル4にあると考えられます)。
>> + [ << [>] >> [C-<< + >>>> [-] + <] > [<] << [D->> + <<<< [-] +>] <-> >>>-<<]
変数hとして、ブロック「a 0 1 0 b」からの単一性が使用されます-とにかく、リセットされた後、効果的な比較はありません。
次のように記述することで、プログラムを少し単純化できます。
hは1です。 while(a){ if(b == 0){C; a = b = 1; hは0です。 } a--; b--; } if(h){D; h = b = 0; }
判明します
>>> + <<< [> [>] >> [C-<< + <[-] + >>>>] <<<-<-] > [-] >> [D-]
プログラムの実行時間は、max(a、b)から線形です。
不明なサイン番号
テープに数字aを書きますが、これについては正か負かはわかりません。 1)リセットする、(2)別のセルにコピーする、(3)a> 0の場合にアクションFを実行する必要があります。 3つの問題をすべて一緒に解決します
それらを解決する方法は? チューリングマシンのテープでゼロ以外のセルを探すのとほぼ同じ方法で、0でつまずくまで左右に実行します。
if(a){ xは1です。 while(x){ y = 2 * x; while(x){ x--; ++; b--; if(a == 0)x = y = 0; } x = 2 * y; while(y){ y--; a--; b ++; if(a == 0){F; x = y = 0; } } } }
変数aはbにコピーされ、アクションFはaの初期値が正の場合にのみ実行されます。 BFへの翻訳:
[>> + <<<<< + [[-<++ >> + <]> [->-> + [>] >> [-<<<< [-] << [-]] <<<<<] << [-> ++> + <<] >> [-> +>-[>] >> [F-<<<< [-] <[-]] <<<<<] <]]
動作時間もabs(a)から直線的です。 ここで、ブロックではif(a == 0)x = y = 0; キャリッジはその場所から遠く離れており、そこに残っています。 しかし、この時点でサイクルが終了するため、これはあまり重要ではありません。
それで何? 8ビットBFマシンで実行できることはすべてここで実行できますか? ああ。 無限のビット深度を備えた車にとっては難しいタスクが1つあります。 つまり、テープ部分をクリーニングします。 ゼロで埋められることが保証されているピースが与えられない場合、それを作成することはできません。 私はそれを証明することはできませんが:(