52 48 bajtów
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
Wypróbuj online!
Kierowca testowy
Wyjaśnienie
W Klein IP zaczyna się w lewym górnym rogu, w prawo. Pierwszym krokiem, który chciałem, aby mój program zrobił, było wysłanie adresu IP z góry programu w celu ustalenia pierwszego i trzeciego bitu. Adres IP ponownie wprowadziłby program w następujący sposób, w zależności od topologii:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
Zdecydowałem, że mój program zapisze trzeci bit topologii przed drugim bitem, ale zamieni je (używając $
) przed końcem. W tym celu dodałem kod do wypychania pierwszego i trzeciego bitu każdej topologii w punktach wejścia IP opisanych powyżej.
./.....
21...01
.......
.......
.......
20...11
.0...0.
Następnie skupiłem się na topologiach z 1
lub 2
jako ich pierwszym kawałku. Postanowiłem zrekombinować je i odesłać po stronie niepołączonej z stroną północną, abym mógł ustalić ich drugi bit.
./.....
21\./01
..>....--> 200, 201, 210, 211
.......
100, 101, 110, 111 <--....<..
20/.\11
.0...0.
^ ^
| |
/ \
110 100
111 101
210 200
211 201
Dogodnie to przegrupowało topologie według ich drugiego bitu, dzięki czemu mogłem przesunąć to na stos.
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
Potem musiałem tylko zamienić drugi i trzeci bit i zakończyć program.
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
Teraz, gdy topologie z 1
lub po uruchomieniu 2
ich pierwszego bitu działały, mogłem skupić się na tworzeniu topologii z 0
poprawnym wynikiem. Pierwszym krokiem było ich ponowne połączenie, tak aby można je było podzielić na dwie grupy na podstawie drugiego bitu.
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
Najpierw skupiłem się na tych topologiach 1
jako drugim fragmencie. Stanowiło to wyzwanie, ponieważ dla nich IP był na linii już używanej przez topologie 2
jako pierwszy bit. Ponieważ byłoby trudniej dopasować więcej niż jedną instrukcję w tej linii (pojedynczą instrukcję można przeskoczyć za pomocą !
instrukcji) i brakowało mi miejsca jako całości, postanowiłem przekierować adres IP z tej linii i ponownie użyć istniejącej 1
instrukcji wcisnąć drugi bit.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Teraz jedyne, co pozostało do zrobienia dla topologii, 1
ponieważ ich drugim bitem było ustalenie kolejności drugiego i trzeciego bitu i zakończenie.
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
Wreszcie pozostały topologie 0
jako ich drugi bit. W programie nie pozostało wiele miejsca, a największe nieużywane miejsce znajduje się w górnym wierszu, więc to właśnie tam przekierowałem adres IP dla topologii z 0
ich drugim bitem.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Nadal musiałem naciskać 0
na drugi bit i naprawić kolejność drugiego i trzeciego bitu, a także zakończyć program. Na szczęście mogłem ponownie wykorzystać istniejącą $
instrukcję, aby instrukcje 0
i @
zmieściły się w pozostałych miejscach.
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Wreszcie nopsy mogą zostać usunięte z końców linii, aby uzyskać końcowy program.