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