Brainfuck,78个字节
开放式赏金:如果有人可以提高此分数,我将把赏金(+500)传递给他们。
@KSab找到了 76 72字节的解决方案!
--<-<<+[+[<+>--->->->-<<<]>]<<--.<++++++.<<-..<<.<+.>>.>>.<<<.+++.>>.>>-.<<<+.
在线尝试!
前28个字节--<-<<+[+[<+>--->->->-<<<]>]
使用以下重复关系(mod 256)初始化磁带:
f n= 171·(-f n-1 -f n-2 -f n-3 +1),f 0= 57,f 1= 123,f 2= 167。
由于3 -1 171 171(mod 256)而产生171的因数。转换当前值后,<+>---
每次返回一个单元格(通过)减去3会有效地将该值乘以171。
在n = 220时,要转换的值为零,并且迭代停止。停止点之前的十个字节如下:
[130, 7, 43, 111, 32, 109, 87, 95, 74, 0]
它包含了Hello, World!
以狩猎和啄食的方式进行生产并稍作调整的所有必需组件。
我还找到了另一种78字节解决方案:
-[++[<++>->+++>+++<<]---->+]<<<<.<<<<-.<..<<+.<<<<.>>.>>>-.<.+++.>>.>-.<<<<<+.
在线尝试!
我认为这比第一个要好,原因有几个:它使用的单元格较少,总共修改了较少的单元格,并且终止速度更快。
更多详情
复发关系在Brainfuck中具有令人惊讶的简洁表示。总体布局如下:
{...s3}<{s2}<{s1}[[<+>->{c1}>{c2}>{c3...}<<<]>{k}]
代表:
f n = c 1 ·f n-1 + c 2 ·f n-2 + c 3 ·f n-3 + ... + k
与
f 0 = s 1,f 1 = s 2 + c 1 ·f 0 + k,f 2 = s 3 + c 2 ·f 0 + c 1 ·f 1 + k等
另外,<+>
可以更改,以在不影响停止点的情况下将范围乘以一个常数,并且可以在之前添加一个术语以在>{k}
不影响停止点的情况下将范围移动一个常数。
其他例子
斐波那契数列
+[[<+>->+>+<<]>]
N角形数
三角数
+[[<+>->++>-<<]>+]
定义为f n = 2·f n-1 -f n-2 +1,其中f 0 = 0,f 1 = 1。
平方数
+[[<+>->++>-<<]>++]
五角形数
+[[<+>->++>-<<]>+++]
等等
高炉紧缩
我已经在github上发布了用于查找某些解决方案的代码。需要.NET 4.0或更高版本。
Usage: bfcrunch [--options] text [limit]
Arguments
------------------------------------------------------------
text The text to produce.
limit The maximum BF program length to search for. If zero, the length of the
shortest program found so far will be used (-r). Default = 0
Options
------------------------------------------------------------
-i, --max-init=# The maximum length of the initialization segment. If excluded, the
program will run indefinitely.
-I, --min-init=# The minimum length of the initialization segment. Default = 14
-t, --max-tape=# The maximum tape size to consider. Programs that utilize more tape than
this will be ignored. Default = 1250
-T, --min-tape=# The minimum tape size to consider. Programs that utilize less tape than
this will be ignored. Default = 1
-r, --rolling-limit
If set, the limit will be adjusted whenever a shorter program is found.
-?, --help Display this help text.
输出分为三行:
- 找到的程序的总长度,以及初始化段。
- 从当前磁带指针开始的路径。每个节点对应一个输出字符,表示为(指针,成本)。
- 使用的磁带段。
例如,最终结果为bfcrunch "hello world" 70 -r -i23
:
64: ++++[[<+>->+++++>+<<]>]
49, (45, 5), (44, 3), (45, 6), (45, 1), (45, 4), (42, 4), (43, 5), (45, 3), (45, 4), (46, 2), (44, 4)
32, 116, 100, 104, 108, 132, 0, 0, 132, 0
这对应于完整程序:
++++[[<+>->+++++>+<<]>]<<<<.<+.>++++..+++.<<<.>+++.>>.+++.>.<<-.
其他记录
你好,世界!
包装,共78个字节:
--<-<<+[+[<+>--->->->-<<<]>]<<--.<++++++.<<-..<<.<+.>>.>>.<<<.+++.>>.>>-.<<<+.
要么
-[++[<++>->+++>+++<<]---->+]<<<<.<<<<-.<..<<+.<<<<.>>.>>>-.<.+++.>>.>-.<<<<<+.
非包装,87字节(以前为92字节(米)):
--->->->>+>+>>+[++++[>+++[>++++>-->+++<<<-]<-]<+++]>>>.>-->-.>..+>++++>+++.+>-->[>-.<<]
你好,世界!
包装,80个字节:
++<-[[<+>->+>--->-<<<]>+++]>+.<<<<<<<++.>>>..>.<<--.<<<--.>>+.>>>.+++.<.<<<-.<+.
非包装,81个字节(以前是92个字节(hirose)):
+>---->->+++>++>->+[++++++++[>++++++++>>+++++<<<-]<]>>.>++>.>..+>>.+>-->--[>-.<<]
你好,世界!
包装,74个字节:
-<++[[<+>->->+++>+<<<]->]<<.---.<..<<.<<<---.<<<<-.>>-.>>>>>.+++.>>.>-.<<.
非包装,84个字节:
---->+++>++>->->++[+++++++[>+++++[>++>>+<<<-]<-]++<]>>>>.---.>---..+>->.+>-->+>[-.<]
世界您好!\ n
包装,76个字节:
+[++[<+++>->+++<]>+++++++]<<<--.<.<--..<<---.<+++.<+.>>.>+.>.>-.<<<<+.[<]>+.
这使用了离开家一个单元的空间,因此将被视为77。
非包装,83个字节:
->+>>>+>>---[++++++++++[>++++++>+++>+<<<-]-<+]>+>+.>.->--..>->-.>[>.<<]>[+>]<<.>++.
Rdebath批准。profilebf输出:
Hello World!
Program size 83
Final tape contents:
: 0 0 73 101 109 115 112 88 33 10 0
^
Tape pointer maximum 10
Hard wrapping would occur for unsigned cells.
Counts: +: 720 -: 79 >: 221 <: 212
Counts: [: 9 ]: 84 .: 13 ,: 0
Total: 1338
你好,世界!
包装70个字节(以前为78 1):
+[++[<+++>->+++<]>+++++++]<<<--.<.<--..<<---.<+++.<+.>>.>+.>.>-.<<<<+.
非包装,77个字节(以前是89 个字节):
->+>>>+>>-[++++++[>+++++++++>+++++>+<<<-]<+]>>.>--.->++..>>+.>-[>.<<]>[>]<<+.
作者声称最短的手写代码“ Hello World!” 是89个字节,但未提供参考。我在此也要求保留该记录。
你好,世界!
包装65字节(以前为66字节):
+++[>--[>]----[----<]>---]>>.---.->..>++>-----.<<<<--.+>>>>>-[.<]
实际上,这也是手工编码的(通过压缩可以找到的最好的是68个字节)。第一个单元格初始化为259(3),并且每次迭代减少7,循环37次。下一个单元格递减6,得出256-6·37 = 34。其余单元每次减少4,每次迭代增加一个单元,每个新单元初始化为252(-4)。结果如下:
[ 3, 0, 0, 0, 0, 0, 0, ...]
[252, 250, 248, 0, 0, 0, 0, ...]
[245, 244, 244, 248, 0, 0, 0, ...]
[238, 238, 240, 244, 248, 0, 0, ...]
[231, 232, 236, 240, 244, 248, 0, ...]
[224, 226, 232, 236, 240, 244, 248, ...]
...
[ 35, 64, 124, 128, 132, 136, 140, ...]
[ 28, 58, 120, 124, 128, 132, 136, ...]
[ 21, 52, 116, 120, 124, 128, 132, ...]
[ 14, 46, 112, 116, 120, 124, 128, ...]
[ 7, 40, 108, 112, 116, 120, 124, ...]
[ 0, 34, 104, 108, 112, 116, 120, ...]
1给出的解决方案(79字节)可以减少一倍:
-[>>+>+[++>-<<]-<+<+]>---.<<<<++.<<----..+++.>------.<<++.>.+++.------.>>-.<+.