Oggi calcoleremo la funzione binaria più efficiente. Più specificamente, calcoleremo la funzione che, quando viene creata un'espressione dall'applicazione della funzione all'ingresso costante 0 o al suo stesso output, può rappresentare tutti gli interi positivi con le espressioni più brevi possibili, ponendo una priorità più alta sugli interi più piccoli.
Questa funzione è costruita come segue:
Per ogni numero intero, partendo da 1 e andando verso l'alto, scegli l'espressione più breve a cui non abbiamo ancora assegnato un output e rendi quel numero intero l'output di quell'espressione. I legami nella lunghezza dell'espressione verranno interrotti da un argomento sinistro più piccolo, quindi da un argomento destro più piccolo. Ecco come funziona:
Inizialmente, 1 non è assegnato. L'espressione non assegnata più corta è
f(0, 0)
, quindi la imposteremo su 1.Ora, 2 non è assegnato. Le espressioni non assegnate più brevi sono
f(f(0, 0), 0)
=f(1, 0)
ef(0, f(0, 0))
=f(0, 1)
. I legami sono interrotti verso argomenti di sinistra più piccoli, quindif(0, 1) = 2
.L'espressione non assegnata più breve rimanente è
f(f(0, 0), 0)
=f(1, 0)
, quindif(1, 0) = 3
.Ora, abbiamo esaurito le espressioni con solo 2 se
f
30
s, quindi dovremo aggiungerne uno in più. Rompendo i legami con l'argomentazione di sinistra, poi con l'argomentazione di destra, otteniamo daf(0, 2) = 4
alloraf(0, f(0, f(0, 0))) = f(0, f(0, 1)) = f(0, 2)
.Proseguendo, abbiamo
f(0, 3) = 5
,f(1, 1) = 6
,f(2, 0) = 7
,f(3, 0) = 8
,f(0, 4) = 9
, ...
Ecco una tabella che ho compilato per i primi valori:
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
Un altro modo di vederlo è che ogni output ha una dimensione, uguale alla somma delle dimensioni dei suoi input più una. La tabella viene compilata in ordine crescente di dimensioni dell'output, legami rotti minimizzando l'input sinistro e quello destro.
La tua sfida è, dato che due numeri interi non negativi come input, calcolano e producono il valore di questa funzione. Questo è il codice golf. Vince la soluzione più breve, in byte. Le scappatoie standard sono vietate.
((0, (0, (0, 0))), 0)
è lessicograficamente più piccolo di (((0, 0), 0), (0, 0))
, tuttavia quest'ultimo ha un lato sinistro più piccolo.