Heute werden wir die effizienteste Binärfunktion berechnen. Im Einzelnen berechnen wir die Funktion, die, wenn ein Ausdruck durch Anwenden der Funktion auf die konstante Eingabe 0 oder ihre eigene Ausgabe erstellt wird, alle positiven Ganzzahlen mit den kürzestmöglichen Ausdrücken darstellen kann, wobei den kleineren Ganzzahlen eine höhere Priorität eingeräumt wird.
Diese Funktion ist wie folgt aufgebaut:
Wählen Sie für jede Ganzzahl ab 1 den kürzesten Ausdruck, dem wir noch keine Ausgabe zugewiesen haben, und machen Sie diese Ganzzahl zur Ausgabe dieses Ausdrucks. Gleichheit in Ausdruckslänge wird durch kleineres linkes Argument und dann durch kleineres rechtes Argument getrennt. So funktioniert das:
Zu Beginn ist 1 nicht zugewiesen. Der kürzeste nicht zugewiesene Ausdruck ist
f(0, 0)
, also setzen wir ihn auf 1.Jetzt ist 2 nicht zugewiesen. Die kürzesten nicht zugewiesenen Ausdrücke sind
f(f(0, 0), 0)
=f(1, 0)
undf(0, f(0, 0))
=f(0, 1)
. Die Krawatten werden also in Richtung kleinerer linker Argumente gebrochenf(0, 1) = 2
.Der kürzeste nicht zugewiesene verbleibende Ausdruck ist
f(f(0, 0), 0)
=f(1, 0)
, alsof(1, 0) = 3
.Jetzt haben wir keine Ausdrücke mehr mit nur 2
f
s und 30
s, also müssen wir von jedem einen weiteren hinzufügen. Das Brechen von Bindungen durch linkes Argument, dann rechtes Argument, bekommen wirf(0, 2) = 4
daf(0, f(0, f(0, 0))) = f(0, f(0, 1)) = f(0, 2)
.Weiter, haben wir
f(0, 3) = 5
,f(1, 1) = 6
,f(2, 0) = 7
,f(3, 0) = 8
,f(0, 4) = 9
, ...
Hier ist eine Tabelle, die ich für die ersten Werte ausgefüllt habe:
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
Eine andere Sichtweise ist, dass jeder Ausgang eine Größe hat, die der Summe der Größen seiner Eingänge plus eins entspricht. Die Tabelle wird in der Reihenfolge der Vergrößerung der Ausgabe ausgefüllt, wobei die Bindungen durch Minimierung der linken Eingabe und der rechten Eingabe aufgehoben werden.
Ihre Herausforderung besteht darin, bei zwei nicht negativen Ganzzahlen als Eingabe den Wert dieser Funktion zu berechnen und auszugeben. Das ist Code Golf. Die kürzeste Lösung in Bytes gewinnt. Standardlücken sind verboten.
((0, (0, (0, 0))), 0)
ist lexikographisch kleiner als (((0, 0), 0), (0, 0))
, letztere hat jedoch eine kleinere linke Seite.