52 48 байт
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
Спробуйте в Інтернеті!
Тест-драйвер
Пояснення
В Кляйн IP починається у верхньому лівому куті, йдучи праворуч. Перший крок, який я хотів зробити моєю програмою, - це надіслати IP-адресу вгорі програми, щоб визначити перший і третій біт. IP буде повторно вводити програму наступним чином залежно від топології:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
Я вирішив, що моя програма запише третій біт топології перед другим бітом, але поміняє їх (використовуючи $
) до кінця. З цією метою я додав код для просування першого та третього бітів кожної топології в точках входу IP, описаних вище.
./.....
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
Зручно це перегрупувало топології їх другим бітом, щоб я міг підштовхнути його до стека.
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
Після цього мені просто потрібно було поміняти місцями другий і третій біт, і програма закінчилася.
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
Тепер, коли топології з 1
чи 2
працював їх перший біт, я міг би зосередитись на створенні топологій з 0
наданням правильного результату. Першим кроком було їх рекомбінація, щоб їх можна було розділити на дві групи на основі їх другого біта.
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
Я спершу зосередився на тих топологіях, 1
як їх другий біт. Вони представляли виклик, оскільки для них IP був на лінії, яку вже використовували топології, 2
як їх перший біт. Оскільки було б складно помістити більше однієї інструкції в цьому рядку (одну інструкцію можна стрибати за допомогою !
інструкції), і мені було недостатньо простору в цілому, я вирішив перенаправити IP-адресу з цієї лінії та повторно використати існуючу 1
інструкцію проштовхнути другий шматочок.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Тепер все, що залишилося зробити для топологій, 1
як їх другий біт, було встановити порядок другого і третього бітів і припинити.
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
Нарешті, залишилися топології, 0
як їх другий біт. У програмі не було багато місця, найбільший невикористаний простір знаходився на верхній лінії, тому саме там я перенаправив IP для топологій 0
як їх другий біт.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Мені ще потрібно натиснути 0
на другий біт і виправити порядок другого і третього бітів, а також припинити програму. До щастя, я був в стані повторно використовувати існуючу $
інструкцію так 0
і @
інструкції могли поміститися в інших приміщеннях.
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Нарешті, кінці можна зняти з кінців рядків, щоб отримати остаточну програму.