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 1
ou 2
comme 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 1
ou 2
dans leur premier bit ont fonctionné, je pouvais me concentrer sur la création de topologies avec 0
la 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 1
comme 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 2
comme 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 1
instruction existante. pousser le second bit.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Maintenant, tout ce qui restait à faire pour les topologies avec 1
leur 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 0
comme 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 0
comme deuxième bit.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Je devais encore pousser 0
pour 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 0
et @
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.