52 48 bytes
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
Experimente online!
Test Driver
Explicação
Em Klein, o IP começa no canto superior esquerdo, indo para a direita. O primeiro passo que eu queria que meu programa fizesse foi enviar o IP da parte superior do programa para determinar o primeiro e o terceiro bits. O IP entraria novamente no programa da seguinte forma, dependendo da topologia:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
Decidi que o meu programa gravaria o terceiro bit da topologia antes do segundo, mas os trocaria (usando $
) antes do final. Para esse fim, adicionei código para enviar o primeiro e o terceiro bits de cada topologia nos pontos de entrada do IP descritos acima.
./.....
21...01
.......
.......
.......
20...11
.0...0.
Em seguida, concentrei-me nas topologias com 1
ou 2
como seu primeiro bit. Decidi recombiná-los e enviá-los para o lado não conectado ao lado norte, para que eu pudesse determinar o 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, isso reagrupou as topologias pelo segundo bit para que eu pudesse colocar isso na pilha.
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
Depois disso, eu só precisava trocar o segundo e o terceiro bits e terminar o programa.
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
Agora que as topologias com 1
ou 2
como o primeiro bit funcionaram, eu poderia me concentrar em fazer as topologias com 0
a saída correta. O primeiro passo foi recombiná-los para que pudessem ser separados em dois grupos com base no segundo bit.
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
Primeiro, foquei nessas topologias com 1
o segundo bit. Isso representou um desafio, porque para eles o IP estava em uma linha já usada pelas topologias com 2
o seu primeiro bit. Como seria complicado ajustar mais de uma instrução nessa linha (uma única instrução pode ser pulada usando a !
instrução) e eu estava com pouco espaço como um todo, decidi redirecionar o IP dessa linha e reutilizar uma 1
instrução existente para empurrar o segundo bit.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Agora, tudo o que restava a ser feito para as topologias com 1
o segundo bit era fixar a ordem do segundo e terceiro bits e terminar.
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
Por fim, permaneceram as topologias com 0
o segundo bit. Não havia muito espaço no programa, com o maior espaço não utilizado na linha superior; portanto, foi lá que eu redirecionei o IP para as topologias com 0
o segundo bit.
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Eu ainda precisava pressionar 0
o segundo bit e corrigir a ordem do segundo e terceiro bits, além de encerrar o programa. Felizmente, pude reutilizar uma $
instrução existente para que as instruções 0
e @
pudessem se encaixar nos espaços restantes.
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Finalmente, os nops podem ser retirados do final das linhas para obter o programa final.