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.Antworten:
Haskell, 110 Bytes
Das Argument hier ist das Tupel
(x,y)
. Ähnlich wie die Antwort oben, aber die Nachschlageliste enthält nur die linken und rechten Indexpaare anstelle der Bäume.quelle
head[...]
ist[...]!!0
und(p,i)<-zip(concat c)[0..]
kann gekürzt werden(i,p)<-zip[0..]$id=<<c
.id=<<
zum Repertoire :)Python 3, 154 Bytes
Es ist weder sehr schnell noch sehr golfen, aber es ist ein Anfang.
quelle
Beeindruckend! Ich habe es tatsächlich geschafft, einen effizienten Berechnungsalgorithmus zu erstellen. Das habe ich zunächst nicht erwartet. Die Lösung ist ziemlich elegant. Es leitet immer wieder mehr ab und kehrt dann bis zum Grundfall 0 zurück. In dieser Antwort bezeichnet die C (n) -Funktion die katalanischen Zahlen .
Der entscheidende erste Schritt ist das Bestätigen, dass es C (0) = 1 Werte der Länge Null gibt (nämlich 0 selbst), C (1) = 1 Werte der Länge Eins (nämlich f (0, 0)), C (2) = 2 Werte der Länge zwei (f (0, f (0, 0)) und f (f (0, 0), 0)).
Das heißt, wenn wir nach dem n-ten Ausdruck suchen und das größte k so finden, dass C (0) + C (1) + ... + C (k) <= n, dann wissen wir, dass n die Länge k hat .
Aber jetzt können wir weitermachen! Weil der gesuchte Ausdruck der n-C (0) -C (1) -C (k) -te Ausdruck in seiner Längenklasse ist.
Jetzt können wir einen ähnlichen Trick anwenden, um die Länge des linken Segments und dann den Rang innerhalb dieses Unterabschnitts zu ermitteln. Und dann greifen Sie auf die Reihen zurück, die wir gefunden haben!
Es wurde festgestellt, dass f (5030, 3749) = 1542317211 im Handumdrehen.
Python, nicht konkurrierend
Ich bin mir ziemlich sicher, dass ich eine Menge unnötiger Berechnungen vornehme und viele Zwischenschritte entfernt werden könnten.
quelle