今日は、最も効率的なバイナリ関数を計算します。より具体的には、定数入力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))
が、後者は左側が小さくなっています。