52 48 byte
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
Provalo online!
Test Driver
Spiegazione
In Klein l'IP inizia nell'angolo in alto a sinistra andando a destra. Il primo passo che volevo fare al mio programma era di inviare l'IP dalla parte superiore del programma per determinare il primo e il terzo bit. L'IP reinserirà il programma come segue a seconda della topologia:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
Ho deciso che il mio programma avrebbe registrato il terzo bit della topologia prima del secondo bit ma li avrebbe scambiati (usando $
) prima della fine. A tal fine ho aggiunto il codice per inviare il primo e il terzo bit di ciascuna topologia nei punti di ingresso dell'IP sopra descritti.
./.....
21...01
.......
.......
.......
20...11
.0...0.
Successivamente mi sono concentrato sulle topologie con 1
o 2
come primo bit. Ho deciso di ricombinarli e di inviarli sul lato non collegato al lato nord in modo da poter determinare il loro secondo bit.
./.....
21\./01
..>....--> 200, 201, 210, 211
.......
100, 101, 110, 111 <--....<..
20/.\11
.0...0.
^ ^
| |
/ \
110 100
111 101
210 200
211 201
Convenientemente, questo ha raggruppato le topologie con il loro secondo bit in modo da poterlo spingere nello stack.
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
Dopodiché avevo solo bisogno di scambiare il secondo e il terzo bit e terminare il programma.
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
Ora che le topologie con 1
o 2
come primo bit funzionavano, potevo concentrarmi sul fare in modo che le topologie 0
fornissero il risultato corretto. Il primo passo è stato ricombinarli in modo da poterli separare in due gruppi in base al secondo bit.
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
In primo luogo mi sono concentrato su quelle topologie con 1
come secondo bit. Questi rappresentavano una sfida perché per loro l'IP era su una linea già utilizzata dalle topologie 2
come primo bit. Dal momento che sarebbe difficile per adattarsi a più di un'istruzione su quella linea (una singola istruzione può essere saltato utilizzando l' !
istruzione) e mi è stato a corto di spazio nel suo insieme, ho deciso di reindirizzare l'IP fuori quella linea e riutilizzare uno esistente 1
di istruzioni per spingere il secondo bit.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Ora tutto ciò che rimaneva da fare per le topologie con 1
il loro secondo bit era correggere l'ordine del secondo e terzo bit e terminare.
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
Infine sono rimaste le topologie con 0
il loro secondo bit. Non era rimasto molto spazio nel programma con lo spazio inutilizzato più grande nella riga superiore, quindi è stato lì che ho reindirizzato l'IP per le topologie con 0
il loro secondo bit.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Avevo ancora bisogno di premere 0
per il secondo bit e correggere l'ordine del secondo e terzo bit, nonché terminare il programma. Fortunatamente, sono stato in grado di riutilizzare un'istruzione esistente in $
modo che le istruzioni 0
e si @
adattassero agli spazi rimanenti.
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Alla fine, il nops può essere rimosso dalle estremità delle linee per ottenere il programma finale.