52 48 octets
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
Essayez-le en ligne!
Pilote d'essai
Explication
À Klein, l’IP commence dans le coin supérieur gauche et va à droite. La première étape que je souhaitais que mon programme fasse est d’envoyer l’adresse IP depuis le début du programme pour déterminer le premier et le troisième bits. L’IP rentrerait dans le programme comme suit en fonction de la topologie:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
J'ai décidé que mon programme enregistrerait le troisième bit de la topologie avant le second bit mais les échangerait (avec $) avant la fin. À cette fin, j'ai ajouté du code pour pousser les premier et troisième bits de chaque topologie aux points d'entrée de l'IP décrits ci-dessus.
./.....
21...01
.......
.......
.......
20...11
.0...0.
Ensuite, je me suis concentré sur les topologies avec 1ou 2comme premier élément. J'ai décidé de les recombiner et de les envoyer du côté non connecté au nord afin de pouvoir déterminer leur deuxième bit.
./.....
21\./01
..>....--> 200, 201, 210, 211
.......
100, 101, 110, 111 <--....<..
20/.\11
.0...0.
^ ^
| |
/ \
110 100
111 101
210 200
211 201
Cela a commodément regroupé les topologies par leur deuxième bit afin que je puisse le transférer vers la pile.
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
Après cela, je devais simplement échanger les deuxième et troisième bits et faire terminer le programme.
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
Maintenant que les topologies avec 1ou 2dans leur premier bit ont fonctionné, je pouvais me concentrer sur la création de topologies avec 0la sortie correcte. La première étape consistait à les recombiner afin de pouvoir les séparer en deux groupes en fonction de leur deuxième bit.
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
Je me suis d'abord concentré sur ces topologies avec 1comme second élément. Celles-ci constituaient un défi, car pour elles, l’IP était sur une ligne déjà utilisée par les topologies avec 2comme premier bit. Puisqu'il serait difficile d'adapter plus d'une instruction sur cette ligne (une instruction unique peut être sautée à l'aide de l' !instruction) et que je manquais beaucoup d' espace, j'ai décidé de rediriger l'IP de cette ligne et de réutiliser une 1instruction existante. pousser le second bit.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Maintenant, tout ce qui restait à faire pour les topologies avec 1leur deuxième bit consistait à fixer l'ordre des deuxième et troisième bits et à se terminer.
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
Restaient enfin les topologies avec 0comme second bit. Il ne restait pas beaucoup d'espace dans le programme, le plus grand espace inutilisé se trouvant sur la première ligne. C'est donc là que j'ai redirigé l'adresse IP pour les topologies 0comme deuxième bit.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Je devais encore pousser 0pour le deuxième bit et fixer l'ordre des deuxième et troisième bits ainsi que terminer le programme. Heureusement, j'ai pu réutiliser une $instruction existante afin que les instructions 0et @puissent être placées dans les espaces restants.
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Enfin, les nops peuvent être supprimés des extrémités des lignes pour obtenir le programme final.