Befunge是一种二维深奥的编程语言。基本思想是将(一个字符)命令放置在二维网格上。控制流遍历网格,执行传递过来的命令,并在命中箭头(>^<v
)时更改方向。命令是基于堆栈的;看到这个清单。另请参见http://esolangs.org/wiki/Befunge。
问题
编写一个程序,将Befunge程序转换为更紧凑的表示形式。例如,以下程序打印0
:
> 0 v
> @ .
^ <
在这种情况下,可以通过删除空格行来压缩它而无需更改程序的行为,从而得到
>0v
>@.
^ <
更复杂的转换可以旋转或镜像命令序列,并消除不必要的控制流命令以压缩程序。例如,使用此程序:
>12345v
6
v....7<
.
.
.
@
您可能会将程序的结尾塞进洞里:
>12345v
>...@ 6
^....7<
对于第一个示例,最紧凑的程序是
>0.@
您可以使用任何转换,只要输出程序给出的结果相同即可。
输入程序
输入程序是有效的Befunge-98程序。
您可以假设输入程序是确定性的。也就是说,它不使用读取外部状态的命令:用户输入命令&
和~
,随机化器?
以及自修改代码命令p
和g
。
您可以假设输入程序终止。
计分
这不是代码高尔夫,而是编写执行代码高尔夫的程序的问题。
输入是一组测试用例(满足上述输入限制的Befunge程序)。总分是测试案例的总分。
每个测试用例的得分
分数是输出程序中非空单元格的凸包的面积,其中每个单元格都视为一个正方形,其四个角为笛卡尔平面中的晶格点。例如,
> v
@ <
获得9.5分。
如果您的程序在特定输入上没有在合理的时间和内存中终止,则得分为输入程序的得分。(这是因为您可以简单地添加一个限时包装程序,如果您的程序没有及时终止,则该包装程序将不变地输出输入程序。)
如果用您的程序处理后,测试用例程序具有不同的结果(或无法终止),则分数为输入程序的分数加100分的罚款。
.
表示输出整数,但是如果从左上角开始,则堆栈中没有要输出的整数。
.
输出一个整数。而且,当堆栈上没有足够的参数时,碰巧会假装那里有足够数量的零。因此,第二个示例将输出000
。
g
并且p
不允许(抱歉,忘记了这些内容;已编辑)。