您在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,并且i
and 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
:'*