今日は、最も効率的なバイナリ関数を計算します。より具体的には、定数入力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と3 のみの式がなくなった0ため、それぞれをもう1つ追加する必要があります。左の引数、右引数で絆を断ち切る、我々が得る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
別の見方をすると、各出力のサイズは、入力のサイズに1を加えた合計に等しくなります。テーブルは、出力のサイズの増加順に記入され、左入力を最小化してから右入力を最小化することにより、関係が壊れます。
あなたの挑戦は、入力として2つの非負整数が与えられ、この関数の値を計算して出力することです。これはコードゴルフです。バイト単位の最短ソリューションが勝ちです。標準的な抜け穴は禁止されています。
((0, (0, (0, 0))), 0)は辞書編集的により小さいです(((0, 0), 0), (0, 0))が、後者は左側が小さくなっています。