今天,我们将计算最有效的二进制函数。更具体地说,我们将计算该函数,当通过将函数应用于常量输入0或它自己的输出创建表达式时,该表达式可以表示具有尽可能短表达式的所有正整数,将较高的优先级放在较小的整数上。
该功能的构建如下:
对于每个从1开始并向上的整数,选择我们尚未为其分配输出的最短表达式,然后将该整数作为该表达式的输出。表达式长度中的纽带将由较小的左参数断开,然后由较小的右参数断开。运作方式如下:
最初,未分配1。最短的未分配表达式是
f(0, 0)
,因此我们将其设置为1。现在,未分配2。最短的未分配表达式是
f(f(0, 0), 0)
=f(1, 0)
和f(0, f(0, 0))
=f(0, 1)
。关系朝着较小的左派论断,所以f(0, 1) = 2
。剩余的最短未分配表达式是
f(f(0, 0), 0)
=f(1, 0)
,所以f(1, 0) = 3
。现在,我们只剩下2
f
s和30
s 的表达式,因此我们必须再添加一个。从左争论开始,然后由右争论打破关系,我们得到f(0, 2) = 4
,因为f(0, f(0, f(0, 0))) = f(0, f(0, 1)) = f(0, 2)
。继续,我们有
f(0, 3) = 5
,f(1, 1) = 6
,f(2, 0) = 7
,f(3, 0) = 8
,f(0, 4) = 9
,...
这是我为前几个值填写的表格:
0 1 2 3 4 5 6 7 8
/---------------------------
0| 1 2 4 5 9 10 11 12 13
1| 3 6 14 15 37 38 39 40 41
2| 7 16 42 43
3| 8 17 44 45
4| 18 46
5| 19 47
6| 20 48
7| 21 49
8| 22 50
另一种看待它的方式是每个输出的大小等于其输入大小之和加一。该表按输出大小增大的顺序填写,并通过最小化左输入然后右输入来打破联系。
您面临的挑战是,给定两个非负整数作为输入,计算并输出此函数的值。这是代码高尔夫。最短的解决方案(以字节为单位)获胜。禁止出现标准漏洞。
((0, (0, (0, 0))), 0)
在字典上小于(((0, 0), 0), (0, 0))
,但是后者的左侧较小。