52 48 byte
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
Cobalah online!
Driver Penguji
Penjelasan
Di Klein IP dimulai di sudut kiri atas ke kanan. Langkah pertama yang saya ingin program saya lakukan adalah mengirim IP dari bagian atas program untuk menentukan bit pertama dan ketiga. IP akan masuk kembali ke program sebagai berikut tergantung pada topologi:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
Saya memutuskan bahwa program saya akan merekam bit ketiga dari topologi sebelum bit kedua tetapi menukar mereka (menggunakan $
) sebelum akhir. Untuk itu saya menambahkan kode untuk mendorong bit pertama dan ketiga dari setiap topologi pada titik masuk IP yang dijelaskan di atas.
./.....
21...01
.......
.......
.......
20...11
.0...0.
Selanjutnya saya fokus pada topologi dengan 1
atau 2
sebagai bit pertama mereka. Saya memutuskan untuk menggabungkan kembali dan mengirimkannya ke sisi yang tidak terhubung ke sisi utara sehingga saya dapat menentukan bit kedua.
./.....
21\./01
..>....--> 200, 201, 210, 211
.......
100, 101, 110, 111 <--....<..
20/.\11
.0...0.
^ ^
| |
/ \
110 100
111 101
210 200
211 201
Dengan mudah ini mengelompokkan kembali topologi dengan bit kedua mereka sehingga saya bisa mendorongnya ke stack.
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
Setelah itu saya hanya perlu menukar bit kedua dan ketiga dan menghentikan program.
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
Sekarang topologi dengan 1
atau 2
sebagai bit pertama mereka berfungsi, saya bisa fokus membuat topologi dengan 0
memberikan hasil yang benar. Langkah pertama adalah mengkombinasikan mereka sehingga mereka dapat dipisahkan menjadi dua kelompok berdasarkan bit kedua mereka.
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
Saya pertama-tama fokus pada topologi-topologi itu dengan 1
bit kedua. Ini menghadirkan tantangan karena bagi mereka IP berada pada jalur yang sudah digunakan oleh topologi 2
sebagai bit pertama mereka. Karena akan sulit untuk memasukkan lebih dari satu instruksi pada baris tersebut (satu instruksi dapat dilompati menggunakan !
instruksi) dan saya kehabisan ruang secara keseluruhan, saya memutuskan untuk mengarahkan IP dari baris itu dan menggunakan kembali 1
instruksi yang ada untuk mendorong bit kedua.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Sekarang semua yang tersisa untuk dilakukan untuk topologi dengan 1
bit kedua mereka adalah untuk memperbaiki urutan bit kedua dan ketiga dan mengakhiri.
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
Terakhir tetap topologi dengan 0
bit kedua mereka. Tidak ada banyak ruang yang tersisa dalam program dengan ruang tidak terpakai terbesar berada di baris atas sehingga di sana saya mengarahkan ulang IP untuk topologi dengan 0
bit kedua mereka.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Saya masih perlu untuk mendorong 0
bit kedua dan memperbaiki urutan bit kedua dan ketiga serta menghentikan program. Untungnya, saya bisa menggunakan kembali $
instruksi yang ada sehingga instruksi 0
dan @
bisa masuk dalam ruang yang tersisa.
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Akhirnya nops dapat dilucuti dari ujung garis untuk mendapatkan program akhir.