Dzisiaj będziemy obliczać najbardziej wydajną funkcję binarną. Mówiąc dokładniej, obliczymy funkcję, która po utworzeniu wyrażenia z zastosowania funkcji do stałego wejścia 0 lub własnego wyjścia może reprezentować wszystkie dodatnie liczby całkowite z możliwie najkrótszymi wyrażeniami, nadając wyższy priorytet mniejszym liczbom całkowitym.
Ta funkcja jest zbudowana w następujący sposób:
Dla każdej liczby całkowitej, zaczynając od 1 i idąc w górę, wybierz najkrótsze wyrażenie, któremu jeszcze nie przypisaliśmy wyjścia, i ustaw tę liczbę całkowitą na wyjście tego wyrażenia. Więzi długości wyrażenia zostaną zerwane przez mniejszy lewy argument, a następnie przez mniejszy prawy argument. Oto jak to działa:
Początkowo 1 jest nieprzypisany. Najkrótsze nieprzypisane wyrażenie to
f(0, 0)
, więc ustawimy to na 1.Teraz 2 jest nieprzypisane. Najkrótsze nieprzypisane wyrażenia to
f(f(0, 0), 0)
=f(1, 0)
if(0, f(0, 0))
=f(0, 1)
. Krawaty są podzielone na mniejsze lewego argumentu, takf(0, 1) = 2
.Najkrótszym pozostałym nieprzypisanym wyrażeniem jest
f(f(0, 0), 0)
=f(1, 0)
, więcf(1, 0) = 3
.Teraz brakuje nam wyrażeń z tylko 2
f
si 30
s, więc będziemy musieli dodać jeszcze jedno z nich. Zerwanie więzi przez lewy argument, a następnie prawy argument, otrzymujemyf(0, 2) = 4
, ponieważf(0, f(0, f(0, 0))) = f(0, f(0, 1)) = f(0, 2)
.Kontynuując, mamy
f(0, 3) = 5
,f(1, 1) = 6
,f(2, 0) = 7
,f(3, 0) = 8
,f(0, 4) = 9
, ...
Oto tabela, którą wypełniłem dla pierwszych kilku wartości:
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
Innym sposobem spojrzenia na to jest to, że każde wyjście ma rozmiar równy sumie wielkości jego danych wejściowych plus jeden. Tabela jest wypełniana w kolejności rosnącej wielkości produkcji, zerwane więzi poprzez zminimalizowanie wejścia lewego i prawego.
Twoim wyzwaniem jest, biorąc pod uwagę dwie nieujemne liczby całkowite jako dane wejściowe, oblicz i wyślij wartość tej funkcji. To jest kod golfowy. Najkrótsze rozwiązanie w bajtach wygrywa. Standardowe luki są zabronione.
((0, (0, (0, 0))), 0)
jest leksykograficznie mniejszy (((0, 0), 0), (0, 0))
, ale ten drugi ma mniejszą lewą stronę.