今天,我们将计算最有效的二进制函数。更具体地说,我们将计算该函数,当通过将函数应用于常量输入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
fs和30s 的表达式,因此我们必须再添加一个。从左争论开始,然后由右争论打破关系,我们得到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)),但是后者的左侧较小。