7、2つのバイト
このプログラムを構成する文字は次のとおりです。
240223
エディターでファイルを表示すると、ASCIIとして解釈しようとする可能性が高く、その場合は次のようになります。
P$
オンラインでお試しください!
プログラムは入力を受け取ります。ここでは、入力がEOFであると想定しています。入力すると、クラッシュする可能性があります。
説明
ゼロ回目の反復
240223
240223 240223を一番上のスタック要素に追加します
ここでのプログラム全体はパッシブであるため、上部のスタック要素(最初は空)にアクティブバージョンを追加します。プログラムは暗黙的なループにあり、反復ごとに(スタックに残したまま)最上位のスタック要素を評価します。したがって、アクティブなバージョンが実行されます。(ほとんどすべての7つのプログラムはこのように始まります。)
最初の反復
240223
2 一番上のスタック要素をコピーします
40 2番目のスタック要素をエスケープし、一番上に入れ替えます
2 一番上のスタック要素をコピーします23一番上のスタック要素を
出力します
出力コマンドの前に、スタックには2つのコピー240223(つまり、パッシブ)が含まれています。一番上のものは出力を取得し(出力形式2、「数値」を選択する以外に観察可能な影響はありません)、下のものが残り、次の反復のプログラムになります。
2回目の反復
240223
240223 240223を一番上のスタック要素に追加します
ゼロ回目の繰り返しと同じですよね?結構です。スタックの内容が異なりました。スタックは240223下にあります。240223240223
3回目の反復
240223 240223
240223 追加240223上部スタック素子に
2 コピー上部スタック素子
40は、 上部にそれをスワップ、第2積層体を脱出
2 コピー上部スタック素子
23を の出力のトップスタック要素
これにより、7と1の場合よりも3と6が多いスタック要素が出力されます。出力フォーマット2は、これを数値の入力要求として解釈します。EOFを読み取ると、スタックの次の要素が長さ0の文字列に削減されます。ただし、バグが原因で(やや有用と思われ、機能に昇格する可能性がありますか?)、これは実行開始後にのみ発生します。スタックには、240223以下の2つの要素がありますが、この最上位の要素のエスケープバージョンが実行されています。24022324022324022372402236240223240223
4回目の反復
7 240223 6 240223240223
7 240223 6 240223240223 240223 240223240223をスタックの一番上に
追加
スタックの先頭は長さ0の文字列だったので、基本的にはそこに到達したプログラムをエスケープしません。
5回目の反復
240223 240223240223
240223 アペンド240223トップスタック要素に
2 トップスタック要素のコピー
40は、 トップにそれを交換する、第二のスタック要素をエスケープ
2 トップスタック要素のコピー
23 の出力のトップスタック要素
2 コピーのトップスタック要素
40は、 第二のエスケープスタック要素、それを一番上に入れ替える
2 一番上のスタック要素をコピーする 23一番上のスタック要素を
出力する
これは3回目の反復と非常によく似ています。ただし、2つの変更があります。まず、1と7に比べて0と6が4つ多いため、数字ではなく標準入力から文字を入力してみます。ただし、依然としてEOFを取得しているため、結果としてスタックの先頭が長さ0の文字列になっています。次に、削減後に実行されるコードがあるため、次の反復はすぐには開始されません。むしろ、その長さゼロの要素に対して一連の操作を行い、結果として長さゼロの要素が3つになります。1つを出力し、他の2つは消えます(反復の終わりなので)。基本的には、3番目の反復の終わりにあった場所に行き着きます。
6回目の反復
スタックの一番上からコピーしたプログラムは今です。最初の出力命令(最初の)に到達するまで、前の反復と同様にすべてが機能します。これにより、1と7に比べて0と6が5つ多くなり、次の出力命令が出力形式を変更する要求として解釈されるモードが設定されます。これは、振る舞いの顕著な変化にもつながります。入力リクエストがなかったため、EOFを読み取らず、EOFを読み取った結果(新しい最上部のスタックエレメントがブランクになっている)をトリガーしなかったため、元のスタックエレメントのエスケープバージョンはそのままではなく、削除されました。つまり、次の240223240223240223240223232402もはやノーオペレーションではなく、エスケープされたスタック要素の2つのエスケープされたコピーを作成します(つまり、それらは現在ダブルエスケープされています)。1つを出力し、出力フォーマットを7に設定します(「入力と同じ」)。この出力形式にはI / Oコマンドがなく、形式を変更するコマンドもないため、プログラムの残りの部分ではそのままにしておきます。また、724022362402232402232402232402236(入力と同じエンコーディングで)標準出力に出力します。
とにかく、この時点からプログラムが何をするのかはかなり明確です。それは、さまざまなエスケープのさまざまな数のコピーを240223スタックの一番上に追加し、スタックの一番上をエスケープし、一番上のコピーを出力することの組み合わせです。スタック。この時点以降は、(EOFを読み取ったことがないため)一番上のスタック要素がクリアされることはないため、成長するだけです。定期的なエスケープにより、出力が繰り返されないことが保証されます(これは、各反復で、最初の出力は7、前の反復で実行されたものより少なくとも1つ多いことから始まります)。
1\n12\n123無効ですか?