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@
В конце концов, шкурки могут быть удалены с концов строк, чтобы получить окончательную программу.