忙脑海狸


13

编写一个不超过256个字符的Brainfuck程序,该程序将采取尽可能多的步骤,但不会无限循环。该程序可能不接受任何输入。

进一步来说:

  • 假设右边有无限多个单元格。
  • <当在左侧的单元格什么都不做。
  • -当单元值是零个集细胞255
  • 这些指令+-<>.在执行时均视为一步。
  • 当一个[]遇到,他会成为一个步骤。然而,如果该条件为真,并控制流程跳到,相应的][再次算作一个步骤。
  • 采取最多步骤的解决方案将获胜。
  • 如果您的解决方案中存在某种模式,则可以提供一个功能,以了解类似长度的程序n将执行多少步,但不是必须的。
  • 要计算指令,可以使用此修改后的解释器

例:

++[-]

遇到的指令是++[-]-],程序运行了7个步骤。


6
如果获胜者在不超过口译员人数的情况下终止,我会感到惊讶。请记住,六态TM忙碌的海狸至少要走10 ** 36534步。
彼得·泰勒

我同意。您似乎很有可能编写可以运行多年的<50 char BF程序。我开始。
captncraig'2

签。位于drb.insel.de/~heiner/BB的 “繁忙的海狸”研究页面非常有趣,尤其是记录程序运行时间非常长且仍具有准确的结果(请参阅drb.insel.de/~heiner/BB/bb)。 -xlist.txt) -模拟记得状态,打造“宏”,以节省模拟步骤等
schnaader

4
@AntonGolov:不幸的是,在这个世界中,当您尝试在其上存储大于256 ^ 字节大小的 bignum时,RAM和HD不会转换为无限的存储设备...
不再

1
@boothby完全有可能在当前计算机上进行涉及先验的精确计算。值的组成部分只需要以比一般日常计算所使用的常规floatdouble原语更抽象的形式存储。(那时,计算机主要只是操纵表示等式的字符串)
AJMansfield 2013年

Answers:


15

这是一个41个字符的程序,该程序最终会停止运行,并留出多个等于1的10↑(10↑28)个连续单元(因此,执行的指令数要大得多):

>+>+>+>+[->[>]+[->[>]+[->[>]+[<]+<]+<]+<]

如果我没记错的话,那就是以下程序的BF变体语言的正确翻译,该语言对每个存储单元都使用一个位(即,单元内容为0..1而不是0..255,所以为“ +”只是简单地翻转位值):

>+>+>+>+[+>[>]+[+>[>]+[+>[>]+[<]+<]+<]+<]

后一个程序产生的精确值(相邻1位的数量)为

3 * (2 ↑ 118842243771396506390315925503 - 1) + 1.


上面的程序初始化并计算一个增长为2↑↑x的函数(用Knuth向上箭头表示)。初始化和计算一个像2↑ 23 x 一样增长的函数的BF型变体程序的类似转换提供了以下256个​​字符的程序:

>+>+>+>+>+>+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[->[>]+[<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+<]+

最终停止,剩下超过2↑ 23 6个等于1的相邻单元格(因此,步数远远超过此数)。

NB-1:2↑ 23 6是一个“不可思议的大”数字;例如,即使2↑ 4 6 = 2↑↑↑↑6已经超过了用于计算Graham数的序列中的第一项(3↑↑↑↑3)。

NB-2:我认为对于BF程序来说,使用256个字符足以初始化和计算一个输出大于Graham数的函数-如果我发现时间,也许我会尝试写一个。

NB-3:如果有人对上述程序的起源感兴趣,这里有一些“ Brainf * ck F”的编程资源,其中包括各种用Python编写的程序。(“ Brainf * ck F”(或简称为“ F”,我称之为Smallf * ck esolanguage 的图灵完备变体。)我现在刚刚上传了这些文件,这些文件已经离线了几年,现在链接的网页只是一个“文件柜”-有关上述程序的详细讨论,请参见文件Busy_Beavers.txt。


目前,这是一个明显的赢家(除非我只是低估了其他人)。欢迎提供更多建议,但现在将其标记为已接受。如果有人不同意,请发表评论。
安东·戈洛夫

当您达到此级别时,假设您拥有无限内存的解释器将变得不切实际。我开始认为使用有限包装的内存将是一个更好的挑战,因此我们可以实际运行答案。
captncraig 2012年

9

这是一个不错的39个字符:

-[>-[>-[-[>+<-]<[>+<-]<[>+<-]>>>]<-]<-]

它基本上制作了一个3个空间宽的“雪橇”,它可以向右移动并递减一个。用31,919,535,558条指令完成,最里面的循环执行256 ^ 3次。我仍然有足够的空间以14个字符的速率将其扩展到运行时的另一个数量级。

在具有无限内存或包装内存的任何解释器上均可使用。

我留给读者一个练习,以确定改进2个循环的版本何时完成:

-[>-[>-[>-[>-[-[>+<-]<[>+<-]<[>+<-]<[>+<-]<[>+<-]>>>>>]<-]<-]<-]<-]

现在它已经运行了一整夜,超过了30亿步。仍然没有通过外循环的一次迭代获得。仅勉强完成了第二个循环的15%。


2

该程序在无限数量的单元格中工作。首先以ascii值255初始化两个值。在主循环的第一个旋转处的第一个值被拆分为255个单元格,并分别以255个初始化。在主循环的第二个旋转处,255个单元格中的每个值再次被拆分最多255 * 255个单元格,以相同的方式循环255次主循环,初始化的总单元格数将为255 ^ 255。第二个值确定主循环要重复多少次。

>->>-[<<[<]>[[[>]>>>[>]-[<]<<<[<]>-]>]>[>>[>]>+<<[<]<-]>>[>]>-]

2

该程序与我以前的程序几乎相同,不同之处在于,确定外部循环的值在特定单元格中保持固定,因此可以增加初始化的单元格数和程序末尾的总步数

->>-<<[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]

在程序255 ^ 255末尾初始化的单元格

-[>-[>->>[-]-<<[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]<-]<-]

在程序255 ^ 255 ^ 3末尾初始化的单元格

我进一步对其进行了修改,使其可以运行更多的步骤。

->>>->>-<<<<<[>>>[>]<[[>>[>]<[[>>[>]-[<]<-]>>[[<+>-]>]<<[<]<]>>[[<+>-]>]<<[<]<-]<[>>>[[<+>-]>]<<[<]]<]>>>>[[<<+>>-]>]<-<<[<]<<-]

它在主循环的第二次旋转255 ^ {255 ^(255 ^ 255 * 255)* 255}单元的过程中初始化主255 ^(255 ^ 255 * 255)单元的第一次旋转过程中的255 ^ 255单元这样循环重复255次


看起来很棒!抱歉,您还没有接受答案-我必须花一些时间来研究这些问题并弄清增长的顺序。当您说“ 255 ^ 255 * 255”时,您是说“ 255 ^(255 * 255)”吗?(否则,我希望“ 255 ^ 256”。)
安东·戈洛夫
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.