Aujourd'hui, nous allons calculer la fonction binaire la plus efficace. Plus précisément, nous calculerons la fonction qui, lorsqu'une expression est créée en appliquant la fonction à l'entrée constante 0 ou à sa propre sortie, peut représenter tous les entiers positifs avec les expressions les plus courtes possibles, en accordant une priorité plus élevée aux plus petits entiers.
Cette fonction est construite comme suit:
Pour chaque entier, en commençant à 1 et en remontant, choisissez l'expression la plus courte à laquelle nous n'avons pas encore attribué de sortie, et faites de cet entier la sortie de cette expression. Les liens de longueur d'expression seront rompus par un argument de gauche plus petit, puis par un argument de droite plus petit. Voici comment ça fonctionne:
Initialement, 1 n'est pas affecté. L'expression non affectée la plus courte est
f(0, 0)
, nous allons donc la mettre à 1.Maintenant, 2 n'est pas affecté. Les expressions non affectées les plus courtes sont
f(f(0, 0), 0)
=f(1, 0)
etf(0, f(0, 0))
=f(0, 1)
. Les liens sont rompus vers un argument de gauche plus petit, doncf(0, 1) = 2
.L'expression non affectée la plus courte restante est
f(f(0, 0), 0)
=f(1, 0)
, doncf(1, 0) = 3
.Maintenant, nous n'avons plus d'expressions avec seulement 2
f
s et 30
s, nous devons donc en ajouter un de plus. Briser les liens par l'argument de gauche, puis l'argument de droite, nous obtenonsf(0, 2) = 4
, depuisf(0, f(0, f(0, 0))) = f(0, f(0, 1)) = f(0, 2)
.En continuant, nous avons
f(0, 3) = 5
,f(1, 1) = 6
,f(2, 0) = 7
,f(3, 0) = 8
,f(0, 4) = 9
, ...
Voici un tableau que j'ai rempli pour les premières valeurs:
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
Une autre façon de voir les choses est que chaque sortie a une taille, égale à la somme des tailles de ses entrées plus une. Le tableau est rempli par ordre croissant de taille de sortie, liens rompus en minimisant l'entrée gauche puis l'entrée droite.
Votre défi est, étant donné deux entiers non négatifs en entrée, calculer et sortir la valeur de cette fonction. C'est le golf de code. La solution la plus courte, en octets, gagne. Les failles standard sont interdites.
((0, (0, (0, 0))), 0)
est lexicographiquement plus petit que (((0, 0), 0), (0, 0))
, cependant, ce dernier a un côté gauche plus petit.