您在Befunge打高尔夫球有哪些一般提示?我正在寻找可用于编码至少在某些方面特定于Befunge的高尔夫问题的想法(例如,“删除评论”不是答案)。请为每个答案发布一个提示。
您在Befunge打高尔夫球有哪些一般提示?我正在寻找可用于编码至少在某些方面特定于Befunge的高尔夫问题的想法(例如,“删除评论”不是答案)。请为每个答案发布一个提示。
Answers:
是否需要在条件之后删除一个值(例如,因为另一条路径取决于该值,但该路径不行)?不使用>$or $<,而是利用您知道变量的真值的事实,并同时使用它_来更改方向和弹出堆栈。
'* : v >$ .. @ Prints number in binary followed by the original
decimal number.
> :2%\2/ :!#^_ \.
被变成
'* : v _ .. @ Since we know that the topmost value on the stack
will be 0, we combine `>$` into `_`.
> :2%\2/ :!#^_ \.
如果您需要输入大于15的数字,请使用'获取下一个字符的ASCII值:
'*
推42而不是:
4a*2+
67*也可以使用
'指令。
代替使用|,而需要另一行(通常带有许多额外的空格),请尝试使用j。例如:
01-`j@more code here
如果堆栈顶部的数字为负,将停止,否则继续。如果需要多个字符,请使用n*j这里n是你需要的时候传递到值的字符数j是0。例:
01-`4*j01-*more code
这将否定一个负数。
j指令。
在Befunge-93中,如果您要推入堆栈的第一件事是字符串,那么通常可以删除开头的引号。例如:
"!iH",,,@
可以简化为:
!iH",,,@
发生的事情是解释器首先尝试执行未加引号的字符串中的字符。,它们!执行无害的not,并且iand H是无效指令,因此它们将被忽略(尽管在某些实现中,您可能会得到警告)。
当"遇到,被认为是字符串的开始,但因为没有右引号,它将绕操场上传所有的方式,直到"遇到第二次。那么最终被压入堆栈的是:
,,,@ ···72 spaces··· !iH
由于我们只关心最后几个字符,因此其他所有内容都不重要。因此,在引用之后,我们最终将执行这三个,命令,写出消息,然后@退出该命令。
注意,这在Befunge-98中通常不起作用,因为无法识别的指令将导致解释器进行反映而不是忽略它。
",,,@!iH。请注意,Pyfunge增加了额外的空间,而FBBI没有。
在Befunge-93中,将循环展平为一行通常是有利的,而代码的循环部分则在两个方向上执行。
例如,考虑下面的代码,该代码输出a八次字母:
"a"9>1-:#v_@
^\,:\<
可以通过在循环序列中插入桥指令(#)将其展平为单行:
"a"9>1#\-#,:#:>#\_@
如果仅查看非空白字符,则可能会觉得它比原始字符长。但是,一旦考虑到换行和两行版本中所需的其他填充,您实际上最终将节省四个字节。
在这种特殊情况下,通过注意该序列:#:可以简单地用替换,可以进一步压缩代码:。
"a"9>1#\-#,:>#\_@
实际上,只要您在一条#命令的任一侧重复执行同一条指令,就可以将其简化为一条指令,因此,在展平循环时,应该始终注意这一点。
为了理解它是如何工作的,它可以帮助写出两次循环序列,一次是将所有字符都#删除掉(即从左到右执行时会发生什么),一次是将所有字符#删除掉(即从右到左执行)。 )。
"a"9>1#\-#,:>#\_@
>1 - :> _ ; executing left to right
> \ ,: \_ ; executing right to left
您现在可以清楚地看到这与代码的原始两行版本如何匹配。
按退出代码输出,这是允许的输出形式。如果质询要求您打印一个数字,则可以通过以q而不是结束程序来保存字节.@
q指令具有不同的功能(排队模式)或不被支持。
在Befunge-93中,字符输入命令(~)通常可以用作-1的快捷方式,因为这是它在EOF上返回的值。
例如,下面的代码将输出-1:
~.@
在生产代码中不建议这样做,因为在交互式环境中运行时,程序将暂停并等待用户输入。显然,如果用户要输入内容,结果将不再是-1。
也就是说,PPCG的规则是程序可以假定输入流为空,这就是通常在TIO上运行的方式。
还要注意,不一定因为您的程序需要从输入流中读取某些内容而使用此技巧。您只需要确保预先处理输入,然后所有将来的使用~都应返回-1。
不要忘记0k不会执行下一条指令。这意味着不要这样做:
;some boolean test;!jv;code if false;
;code if true;<
您可以通过执行以下操作来保存角色
;some boolean test;kv;code if false;
;code if true;<
k指令。
不要忘了k操作员。相反"!dlroW olleH",,,,,,,,,,,,@,要做"!dlroW olleH"bk,@。请注意,k不操作的细胞,它是在这样9k,将不打印9倍,但10; 用9次,用k一次,。
k指令。
当将小数字推入堆栈时,您可能会很容易地弄清楚,这45*将吸引您20,也67*将吸引您42。但是,当涉及到更大的数字时,您确实需要一个可以为您计算最有效表示的程序。
最简单的选择是MikeSchwörer的BefunRep在线界面。您只需输入数字,它就会吐出一个等效的Befunge表示形式。它并不总是最理想的,但它已经足够接近了,几乎可以肯定它比您可以手工完成的任何事情都要好。
在线系统限制为0到16777215之间的数字,因此,如果您需要的数字更大,则需要下载独立的BefunRep实用程序并自己运行计算。
如果您使用Befunge-98进行编程,则可以考虑使用Fungify。通常,它不如BefunRep最佳,但是对于一些较低的数字(十六进制数字和单引号字符最有效),有时可以产生更好的结果。
'。例如42:'*