52 48 ไบต์
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
ลองออนไลน์!
ทดสอบไดร์เวอร์
คำอธิบาย
ในไคลน์ IP เริ่มต้นที่มุมซ้ายบนไปทางขวา ขั้นตอนแรกที่ฉันต้องการให้โปรแกรมทำคือส่ง IP ออกจากด้านบนของโปรแกรมเพื่อกำหนดบิตที่หนึ่งและสาม IP จะป้อนโปรแกรมดังต่อไปนี้อีกครั้งโดยขึ้นอยู่กับโทโพโลยี:
^
I|P
./.....
201, 211 -->.......<-- 100, 110
.......
.......
.......
200, 210 -->.......<-- 101, 111
.......
^ ^
| |
000 001
010 011
ฉันตัดสินใจว่าโปรแกรมของฉันจะบันทึกบิตที่สามของทอพอโลยีก่อนบิตที่สอง แต่สลับพวกเขา (ใช้$
) ก่อนจบ ด้วยเหตุนี้ฉันจึงเพิ่มรหัสเพื่อผลักดันบิตที่หนึ่งและสามของแต่ละทอพอโลยีที่จุดเข้าของ IP ที่อธิบายไว้ข้างต้น
./.....
21...01
.......
.......
.......
20...11
.0...0.
ต่อไปฉันมุ่งเน้นทอพอโลยีด้วย1
หรือ2
เป็นบิตแรกของพวกเขา ฉันตัดสินใจรวมเข้าด้วยกันอีกครั้งและส่งออกไปทางด้านข้างที่ไม่ได้เชื่อมต่อกับทางด้านทิศเหนือดังนั้นฉันสามารถหาบิตที่สองของพวกเขาได้
./.....
21\./01
..>....--> 200, 201, 210, 211
.......
100, 101, 110, 111 <--....<..
20/.\11
.0...0.
^ ^
| |
/ \
110 100
111 101
210 200
211 201
สิ่งอำนวยความสะดวกนี้จัดกลุ่มโทโพโลยีใหม่โดยบิตที่สองของพวกเขาเพื่อให้ฉันสามารถผลักมันไปที่สแต็ก
./.....
21\./01
..>....
.......
....<..
20/.\11
.01.00.
หลังจากนั้นฉันแค่ต้องสลับบิตที่สองและสามและให้โปรแกรมหยุดทำงาน
./.$...
21\./01
..>....
@......
....<..
20//\11
.01$00.
ตอนนี้ทอพอโลยีที่มี1
หรือ2
เป็นบิตแรกของพวกเขาทำงานฉันสามารถมุ่งเน้นไปที่การทำทอพอโลยีด้วยการ0
ให้ผลลัพธ์ที่ถูกต้อง ขั้นตอนแรกทำการรวมเข้าด้วยกันอีกครั้งเพื่อให้สามารถแยกออกเป็นสองกลุ่มโดยยึดตามบิตที่สอง
./.$...
21\./01
..>....<-- 010, 011
@......
000, 001, 010, 011 <--.<..<<.<-- 000, 001
20//\11
.01$00.
ฉันแรกเน้นที่ทอพอโลยีเหล่านั้นด้วย1
เป็นบิตที่สองของพวกเขา สิ่งเหล่านี้แสดงให้เห็นถึงความท้าทายเพราะสำหรับพวกเขา IP นั้นอยู่ในบรรทัดที่โทโพโลยีใช้อยู่แล้วซึ่ง2
เป็นบิตแรกของพวกเขา เนื่องจากมันเป็นการยากที่จะใส่คำสั่งมากกว่าหนึ่งคำสั่งในบรรทัดนั้น (คำสั่งเดียวสามารถกระโดดได้โดยใช้!
คำสั่ง) และฉันมีพื้นที่เหลือน้อยโดยรวมฉันจึงตัดสินใจเปลี่ยนเส้นทาง IP จากบรรทัดนั้นและนำ1
คำสั่งที่มีอยู่กลับมาใช้ใหม่เพื่อดันบิตที่สอง
./.$...
21\./01
..>..!\
@......
.<..<<.
20//\11
.01$00.
ตอนนี้สิ่งที่เหลือไว้สำหรับทอพอโลยีที่1
เป็นบิตที่สองของพวกเขาคือการแก้ไขคำสั่งของบิตที่สองและสามและยุติ
^
|
./.$..$
21\./01
..>..!\
@......
.<..<<.
20//\11
@01$00@
^ ^
| |
011 010
สุดท้ายยังคงทอพอโลยี0
เป็นบิตที่สองของพวกเขา มีพื้นที่เหลือไม่มากในโปรแกรมที่มีพื้นที่ที่ไม่ได้ใช้มากที่สุดอยู่บนบรรทัดบนสุดดังนั้นจึงมีการเปลี่ยนเส้นทาง IP สำหรับทอพอโลยี0
เป็นบิตที่สอง
./.$.<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
ฉันยังต้องกด0
บิตที่สองและแก้ไขลำดับของบิตที่สองและสามเช่นเดียวกับการยกเลิกโปรแกรม โชคดีที่ฉันสามารถนำ$
คำสั่งที่มีอยู่กลับมาใช้ใหม่เพื่อให้คำสั่ง0
และ@
คำแนะนำสามารถพอดีกับพื้นที่ที่เหลือ
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
ในที่สุดน๊อตสามารถแยกออกจากปลายสายเพื่อรับโปรแกรมสุดท้าย