Befunge高尔夫技巧


12

您在Befunge打高尔夫球有哪些一般提示?我正在寻找可用于编码至少在某些方面特定于Befunge的高尔夫问题的想法(例如,“删除评论”不是答案)。请为每个答案发布一个提示。


我不确定这是否应该在一般改为Befunge,但Befunge 93是理想的要少得多的高尔夫比98
贾斯汀

6
我们最近有一个Befunge 93主题,但我认为最好将这个主题概括化。可以吗?(并且可能以与Python提示说明它们是否特定于Python 2 / Python 3相同的方式标记哪些提示适合于哪个版本)
Sp3000 2015年

Answers:


9

使用多行循环时,请尝试尽可能多地使用它:

>1234....v
^        <

>1234v
^....<

7

是否需要在条件之后删除一个值(例如,因为另一条路径取决于该值,但该路径不行)?不使用>$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/ :!#^_ \.

6

别忘了0它总是在堆栈中。例如,这意味着,对于一个空栈,g是等同于00gp等效于000p


5

如果您需要输入大于15的数字,请使用'获取下一个字符的ASCII值:

'*

推42而不是:

4a*2+

或者,67*也可以使用
门把手

4
@Doorknob也许我应该选择一个质数来使我的观点更清楚,但42真是个好数字。
贾斯汀

2
请注意,本技巧仅适用于Befunge-96和更高版本。Befunge-93不支持该'指令。
James Holderness

4

代替使用|,而需要另一行(通常带有许多额外的空格),请尝试使用j。例如:

01-`j@more code here

如果堆栈顶部的数字为负,将停止,否则继续。如果需要多个字符,请使用n*j这里n是你需要的时候传递到值的字符数j0。例:

01-`4*j01-*more code

这将否定一个负数。


请注意,本技巧仅适用于Befunge-96和更高版本。Befunge-93不支持该j指令。
James Holderness

4

在Befunge-93中,如果您要推入堆栈的第一件事是字符串,那么通常可以删除开头的引号。例如:

"!iH",,,@

可以简化为:

!iH",,,@

在线尝试!

发生的事情是解释器首先尝试执行未加引号的字符串中的字符。,它们!执行无害的not,并且iand H是无效指令,因此它们将被忽略(尽管在某些实现中,您可能会得到警告)。

"遇到,被认为是字符串的开始,但因为没有右引号,它将绕操场上传所有的方式,直到"遇到第二次。那么最终被压入堆栈的是:

,,,@  ···72 spaces···  !iH

由于我们只关心最后几个字符,因此其他所有内容都不重要。因此,在引用之后,我们最终将执行这三个,命令,写出消息,然后@退出该命令。

注意,这在Befunge-98中通常不起作用,因为无法识别的指令将导致解释器进行反映而不是忽略它。


在Befunge-98可以转而把需要串在结束行,像这样的; ",,,@!iH。请注意,Pyfunge增加了额外的空间,而FBBI没有。
Jo King

@JoKing我不想提出这个建议,因为正如您所指出的,每个解释器的行为都不同。即使它似乎可以工作,它还是不一致的(在这种情况下,请注意FBBI中的额外空间),因此很有可能是一个错误,最终可能会在某个时间被修复。
James Holderness

嗯...我认为空间实际上可能是规范的一部分。我记得在某处读过,多个空格将被跳过并计为单个空格。实施例在两个PyFunge和FBBI。FBBI似乎将每行填充到最长行的长度,而PyFunge隐式添加了额外的空格。
Jo King

没错-规范确实指出,字符串中的多个空格应视为一个空格。实际上,该规则是专门为处理将字符串包装在无限运动场中的问题而专门提出的(因此PyFunge显然是正确的AFAIC)。但是规范对包装算法的描述在某种程度上是开放的,因此我可以理解为什么某些实现可能会有所不同。但最重要的是,这是一个相当复杂的问题,我认为最好将其作为Befunge-97 / 98的单独技巧来涵盖。
James Holderness

4

在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

您现在可以清楚地看到这与代码的原始两行版本如何匹配。


3

按退出代码输出,这是允许的输出形式。如果质询要求您打印一个数字,则可以通过以q而不是结束程序来保存字节.@


2
请注意,本技巧仅适用于Befunge-98和更高版本。在早期版本的Befunge中,q指令具有不同的功能(排队模式)或不被支持。
James Holderness

3

在Befunge-93中,字符输入命令(~)通常可以用作-1的快捷方式,因为这是它在EOF上返回的值。

例如,下面的代码将输出-1:

~.@

在线尝试!

在生产代码中不建议这样做,因为在交互式环境中运行时,程序将暂停并等待用户输入。显然,如果用户要输入内容,结果将不再是-1。

也就是说,PPCG的规则是程序可以假定输入流为空,这就是通常在TIO上运行的方式。

还要注意,不一定因为您的程序需要从输入流中读取某些内容而使用此技巧。您只需要确保预先处理输入,然后所有将来的使用~都应返回-1。


2

在处理_或时|,请使用IP的方向,而不要在处使用额外的字符!

真实示例(来自此帖子):

#v~
,>:!#@_

可以更改为

#v~
:<,_@#

2

不要忘记0k不会执行下一条指令。这意味着不要这样做:

;some boolean test;!jv;code if false;
       ;code if true;<

您可以通过执行以下操作来保存角色

;some boolean test;kv;code if false;
      ;code if true;<

请注意,本技巧仅适用于Befunge-98和更高版本。Befunge的早期版本不支持该k指令。
James Holderness

1

不要忘了k操作员。相反"!dlroW olleH",,,,,,,,,,,,@,要做"!dlroW olleH"bk,@。请注意,k不操作的细胞,它是在这样9k,将不打印9倍,但10; 用9次,用k一次,


1
请注意,本技巧仅适用于Befunge-98和更高版本。Befunge的早期版本不支持该k指令。
James Holderness

1

当将小数字推入堆栈时,您可能会很容易地弄清楚,这45*将吸引您20,也67*将吸引您42。但是,当涉及到更大的数字时,您确实需要一个可以为您计算最有效表示的程序。

最简单的选择是MikeSchwörer的BefunRep在线界面。您只需输入数字,它就会吐出一个等效的Befunge表示形式。它并不总是最理想的,但它已经足够接近了,几乎可以肯定它比您可以手工完成的任何事情都要好。

在线系统限制为0到16777215之间的数字,因此,如果您需要的数字更大,则需要下载独立的BefunRep实用程序并自己运行计算。

如果您使用Befunge-98进行编程,则可以考虑使用Fungify。通常,它不如BefunRep最佳,但是对于一些较低的数字(十六进制数字和单引号字符最有效),有时可以产生更好的结果。


在Befunge 98中推小数字时,您可以使用'。例如42'*
贾斯汀

@Justin我在上一段中提到了这一点,但是,本文的重点是,您只需要使用一种工具来生成数字就不需要了解很多这些技巧。
James Holderness
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.