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 1lub 2jako 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 1lub po uruchomieniu 2ich pierwszego bitu działały, mogłem skupić się na tworzeniu topologii z 0poprawnym 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 1jako drugim fragmencie. Stanowiło to wyzwanie, ponieważ dla nich IP był na linii już używanej przez topologie 2jako 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 1instrukcji wcisnąć drugi bit.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Teraz jedyne, co pozostało do zrobienia dla topologii, 1ponieważ 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 0jako 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 0ich drugim bitem.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Nadal musiałem naciskać 0na 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 0i @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.