52 48 bytes
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
Pruébalo en línea!
Conductor de prueba
Explicación
En Klein, la IP comienza en la esquina superior izquierda hacia la derecha. El primer paso que quería que hiciera mi programa era enviar la IP desde la parte superior del programa para determinar el primer y el tercer bit. La IP volvería a ingresar al programa de la siguiente manera, según la topología:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
Decidí que mi programa registraría el tercer bit de la topología antes del segundo bit, pero los cambiaría (usando $
) antes del final. Con ese fin, agregué código para empujar el primer y el tercer bit de cada topología en los puntos de entrada de IP descritos anteriormente.
./.....
21...01
.......
.......
.......
20...11
.0...0.
Luego me concentré en las topologías con 1
o 2
como su primer bit. Decidí recombinarlos y enviarlos al lado no conectado al lado norte para poder determinar su segundo bit.
./.....
21\./01
..>....--> 200, 201, 210, 211
.......
100, 101, 110, 111 <--....<..
20/.\11
.0...0.
^ ^
| |
/ \
110 100
111 101
210 200
211 201
Convenientemente, esto reagrupó las topologías en su segundo bit para poder empujar eso a la pila.
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
Después de eso, solo necesitaba intercambiar el segundo y tercer bit y hacer que el programa terminara.
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
Ahora que las topologías con 1
o 2
como su primer bit funcionaron, podría concentrarme en hacer que las topologías 0
den el resultado correcto. El primer paso fue recombinarlos para que pudieran separarse en dos grupos en función de su segundo bit.
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
Primero me enfoqué en esas topologías con 1
su segundo bit. Estos presentaron un desafío porque para ellos la IP estaba en una línea ya utilizada por las topologías 2
como primer bit. Como sería difícil ajustar más de una instrucción en esa línea (se puede saltar una sola instrucción usando la !
instrucción) y me estaba quedando sin espacio en general, decidí redirigir la IP fuera de esa línea y reutilizar una 1
instrucción existente para empujar el segundo bit.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Ahora todo lo que quedaba por hacer para las topologías con 1
su segundo bit era arreglar el orden del segundo y tercer bit y terminar.
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
Finalmente quedaron las topologías con 0
su segundo bit. No quedaba mucho espacio en el programa con el mayor espacio no utilizado en la línea superior, por lo que fue allí donde redirigí la IP para las topologías con 0
su segundo bit.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Todavía necesitaba presionar 0
por el segundo bit y arreglar el orden del segundo y tercer bit, así como terminar el programa. Afortunadamente, pude reutilizar una $
instrucción existente para que las instrucciones 0
y @
pudieran caber en los espacios restantes.
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Finalmente, los nops se pueden quitar de los extremos de las líneas para obtener el programa final.