52 48字节
./@$0<$
21\./01
..>..!\
@
.<..<\
20//\11
@01$00@
在线尝试!
测试驱动
说明
在Klein中,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
and @
指令可以适合剩余的空间。
./@$0<$
21\./01
..>..!\
@......
.<..<\.
20//\11
@01$00@
最终,可以从行尾去除点,以获得最终程序。