这个挑战是奖ais523为赢得了“ 年度最佳新秀类别”中的“ 最佳PPCG 2016 ”。恭喜你!
BackFlip是由ais523用户开发的一种深奥的编程语言,他已经创建了30多种其他有趣的esolang。
BackFlip是一种2D语言,例如Befunge或> <>,其中指令指针遍历文本网格(程序),上下移动,左右移动,并根据其所在的字符改变方向。至关重要的是,BackFlip程序中的网格在遍历时会发生变化,有点像Langton的Ant。
对于此挑战,您可以假定BackFlip程序始终是文本的矩形网格(所有行的长度相同),最小大小为1×1,仅包含字符./\<>^V
。(.
用于可见性,而不是空间。)语义上,我们将在此处使用的BackFlip与原始规范相同。
BackFlip中的指令指针(IP)始终从程序左上角的左侧开始,一直向右移动。它可以遇到三种命令:
.
是无人操作。IP继续朝着前进的方向发展。无操作保持无操作。/
并且\
是镜子。它们沿其角度指示的方向反射IP,然后变为另一种类型的反射镜。- 例如,如果IP头向左
\
移动,它将开始向上移动,而不是向左移动,然后\
变为a/
。
- 例如,如果IP头向左
<
,>
,^
,和V
是箭头。他们将IP重定向到其指向的方向,然后变为箭头,指向IP的来源方向(与IP的移动方向相反)。- 例如,如果IP向下进入
>
,则它开始向右移动而不是向下移动,并且>
变为,^
因为这就是IP的方向。
- 例如,如果IP向下进入
当IP超出范围(即脱离网格)时,BackFlip程序终止。事实证明,所有 BackFlip程序最终都会终止,因为不可能进行无限循环。(您可能认为这是真的。)
您在此挑战中的目标是编写一个程序或函数,该程序或函数接受BackFlip程序并输出指令指针在程序终止之前执行的移动次数。也就是说,IP在运行程序的过程中需要采取多少步骤?这包括进入网格的初始步骤和离开网格的最后一步。
例如,指令指针在平凡的网格中采用了5个步骤....
:
.... <- empty 4×1 grid
012345 <- step number of the IP
因此,输出....
为5
。
在更复杂的4×2网格中
\...
\.><
IP在第9步退出网格,因此输出为9
:
step grid IP position (@)
0 \... @....
\.>< ....
1 \... @...
\.>< ....
2 /... ....
\.>< @...
3 /... ....
/.>< .@..
4 /... ....
/.>< ..@.
5 /... ....
/.<< ...@
6 /... ....
/.<< ..@.
7 /... ....
/.>< .@..
8 /... ....
/.>< @...
9 /... ....
\.>< ....
@
以字节为单位的最短代码获胜。
如果需要,您可以将输入作为行或字符矩阵的数组,而不是多行字符串,但是必须使用字符./\<>^V
(而不是整数操作码)。您可以使用空格代替,.
如果需要的话。如果\
需要在输入中转义这样的字符,这很好。输出始终是一个大于1的整数。
测试用例
....
5
\...
\.><
9
.
2
..
3
.
.
2
\
2
^
2
.^.
3
<.
2
\\
\/
7
>V
^<
6
>\
>/
6
\><
2
\><
\><
7
\><
\><
\><
12
\.V.
\.\<
5
\.V.
\./<
9
V./\
V./\
>./<
..\/
14
\V..
.^..
\/><
.V..
.^..
20
\.V.V.
\./.\<
.>\<..
..^.^.
31
\.V.V.V.
\./>/.\<
.>\>\<..
..^.^.^.
69
\.V.V.V.V.
\./>/>/.\<
.>\>\>\<..
..^.^.^.^.
145
\.V.V.V.V.V.V.V.V.V.V.
\./>/>/>/>/>/>/>/>/.\<
.>\>\>\>\>\>\>\>\>\<..
..^.^.^.^.^.^.^.^.^.^.
9721
/
将使IP上升,而向上进入/
将使IP正确,就好像它是从墙上弹起的球一样。(但请记住/
IP接触到反斜杠后所做的更改。)