Hoje, calcularemos a função binária mais eficiente. Mais especificamente, calcularemos a função que, quando uma expressão é criada a partir da aplicação da função na entrada constante 0 ou em sua própria saída, pode representar todos os números inteiros positivos com as expressões mais curtas possíveis, colocando maior prioridade nos números inteiros menores.
Esta função é criada da seguinte maneira:
Para cada número inteiro, começando em 1 e subindo, escolha a expressão mais curta à qual ainda não atribuímos uma saída e torne esse número inteiro a saída dessa expressão. Os laços no comprimento da expressão serão quebrados pelo argumento menor à esquerda e depois pelo argumento menor à direita. Veja como funciona:
Inicialmente, 1 não está atribuído. A expressão mais curta não atribuída é
f(0, 0), portanto, definiremos isso como 1.Agora, 2 não está atribuído. As expressões mais curtas não atribuídas são
f(f(0, 0), 0)=f(1, 0)ef(0, f(0, 0))=f(0, 1). Os laços são quebrados para um argumento menor à esquerda, entãof(0, 1) = 2.A expressão mais curta não atribuída restante é
f(f(0, 0), 0)=f(1, 0), entãof(1, 0) = 3.Agora, estamos sem expressões com apenas 2 se
f30s, então teremos que adicionar mais uma de cada. Rompendo laços com o argumento da esquerda, depois o argumento da direita, entendemosf(0, 2) = 4desde entãof(0, f(0, f(0, 0))) = f(0, f(0, 1)) = f(0, 2).Continuando, temos
f(0, 3) = 5,f(1, 1) = 6,f(2, 0) = 7,f(3, 0) = 8,f(0, 4) = 9, ...
Aqui está uma tabela que preenchi para os primeiros valores:
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
Outra maneira de ver é que cada saída tem um tamanho igual à soma dos tamanhos de suas entradas mais um. A tabela é preenchida em ordem crescente de tamanho de saída, empates quebrados minimizando a entrada esquerda e a entrada direita.
Seu desafio é, considerando dois números inteiros não negativos como entrada, calcule e produza o valor dessa função. Isso é código de golfe. A solução mais curta, em bytes, vence. As brechas padrão são proibidas.
((0, (0, (0, 0))), 0)é lexicograficamente menor que (((0, 0), 0), (0, 0)), no entanto, este último tem um lado esquerdo menor.