52 48 bayt
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
Çevrimiçi deneyin!
Test Sürücüsü
açıklama
Klein'da IP sol üst köşeden başlayarak sağa doğru ilerliyor. Programımın yapmasını istediğim ilk adım, ilk ve üçüncü bitleri belirlemek için IP'yi programın üst kısmından göndermek oldu. IP, topolojiye bağlı olarak programı aşağıdaki şekilde yeniden girecektir:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
Programımın, ikinci bitten önce topolojinin üçüncü bitini kaydetmesine karar verdim, ancak $
sonundan önce bunları kullanarak değiştirdim . Bu amaçla, her topolojinin birinci ve üçüncü bitlerini IP'nin yukarıda açıklanan giriş noktalarına itmesi için kod ekledim.
./.....
21...01
.......
.......
.......
20...11
.0...0.
Daha sonra , ilk bitle 1
veya 2
ilk topoğrafya olarak topolojilere odaklandım . Onları yeniden birleştirmeye ve kuzey tarafına bağlı olmayan tarafa göndermeye karar verdim, böylece ikinci bitlerini belirleyebildim.
./.....
21\./01
..>....--> 200, 201, 210, 211
.......
100, 101, 110, 111 <--....<..
20/.\11
.0...0.
^ ^
| |
/ \
110 100
111 101
210 200
211 201
Bu, topolojileri ikinci bitleriyle yeniden birleştirdi, böylece onu yığına itebildim.
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
Ondan sonra sadece ikinci ve üçüncü bitleri değiştirmem ve programın sonlandırılması gerekiyordu.
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
Şimdi, ilk biti ile 1
ya 2
da ilk biti olarak topolojiler işe yaradığında, topolojileri 0
doğru çıktılarla vermeye odaklanabiliyorum . İlk adım, ikinci bitlerine göre iki gruba ayrılabilmeleri için onları yeniden birleştirmekti.
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
İlk önce bu topolojilere 1
ikinci biti olarak odaklandım . Bunlar bir zorluk sundu çünkü onlar için IP, topolojiler tarafından zaten 2
ilk biti olarak kullanılan bir çizgideydi . Bu hatta birden fazla talimatın yerleştirilmesi zor olacağından (talimat kullanılarak tek bir komut atlanabilir !
) ve bir bütün olarak alan üzerinde azalıyordum, IP'yi bu satırdan yönlendirmeye ve mevcut bir 1
talimatı yeniden kullanmaya karar verdim ikinci biti itmek için.
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
Şimdi topolojiler 1
için ikinci biti ile kalan tek şey ikinci ve üçüncü biti sırasını düzeltmek ve sonlandırmaktı.
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
Son 0
olarak, ikinci bit olarak topolojiler kaldı . Programda çok fazla alan kalmadı ve en büyük kullanılmayan alan üst satırdaydı, bu yüzden de topolojiler için IP'yi 0
ikinci bitleri ile birlikte yönlendirdim .
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
0
İkinci biti zorlamaya ve ikinci ve üçüncü biti sırasını düzeltmeye ve programı sonlandırmaya ihtiyacım vardı. Neyse ki varolan yeniden başardı $
böylece talimat 0
ve @
yönergeler kalan alanlarda sığabilir.
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
Son olarak, uçlar, son programı elde etmek için çizgilerin uçlarından sıyrılabilir.