52 48バイト
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
オンラインでお試しください!
テストドライバー
説明
Kleinでは、IPは左上隅から右に向かって始まります。プログラムで最初にしたかったのは、プログラムの先頭からIPを送信して、1番目と3番目のビットを決定することでした。トポロジに応じて、IPは次のようにプログラムに再入力します。
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
私のプログラムは、トポロジーの3番目のビットを2番目のビットの前に記録し$
、終了する前に(を使用して)スワップすることにしました。そのために、上記のIPのエントリポイントで各トポロジの最初と3番目のビットをプッシュするコードを追加しました。
./.....
21...01
.......
.......
.......
20...11
.0...0.
次に、最初のビットとして、1
または2
最初のビットとしてトポロジに焦点を当てました。私はそれらを再結合し、北側に接続されていない側でそれらを送信することにしました。
./.....
21\./01
..>....--> 200, 201, 210, 211
.......
100, 101, 110, 111 <--....<..
20/.\11
.0...0.
^ ^
| |
/ \
110 100
111 101
210 200
211 201
都合の良いことに、これはトポロジーを2番目のビットで再グループ化したので、それをスタックにプッシュできました。
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
その後、2番目と3番目のビットを交換して、プログラムを終了する必要がありました。
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
最初のビットを1
使用2
した、または最初のビットとして機能するトポロジが0
できたので、正しい出力を提供するトポロジの作成に集中できました。最初のステップは、2番目のビットに基づいて2つのグループに分離できるように、それらを再結合することでした。
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
最初に1
、2番目のビットとしてこれらのトポロジに焦点を当てました。これらは、2
最初のビットとしてトポロジですでに使用されている回線上にIPがあったため、課題を提示しました。その行に複数の命令を収めるのは難しい(命令を使用して単一の命令をジャンプできる!
)ため、全体としてスペースが不足しているため、その行からIPをリダイレクトし、既存の1
命令を再利用することにしました2番目のビットをプッシュします。
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
1
2番目のビットが2番目と3番目のビットの順序を修正して終了することであるため、トポロジの処理は残りました。
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
最後に0
、2番目のビットとしてトポロジが残りました。プログラムに残っているスペースはほとんどなく、一番上の行に最大の未使用スペースがあったため、0
2番目のビットとしてトポロジーのIPをリダイレクトしました。
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
それでも0
、2番目のビットをプッシュして、2番目と3番目のビットの順序を修正し、プログラムを終了する必要がありました。幸い、私は既存の再利用することができた$
ので、命令を0
し、@
命令は残りのスペースに合うことができます。
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
最後に、最後のプログラムを取得するために、行末からnopsを取り除くことができます。