fundo
A sequência 1-2-3-Tribonacci
Imagine por um segundo que você poderia criar uma sequência de fibonacci substituindo a fórmula de iteração padrão pela seguinte:
Basicamente, em vez de somar os dois últimos para obter o próximo, você soma os três últimos. Esta é a base para a sequência 1-2-3-Tribonacci.
Critério de Brown
O critério de Brown declara que você pode representar qualquer valor inteiro como uma soma dos membros de uma sequência, desde que:
Para todos
n
maiores que 1,
O que isso significa para o desafio
Você pode descrever qualquer número inteiro positivo como uma soma dos membros da sequência 1-2-3-Tribonacci formada pelas seguintes condições iniciais:
Isso é conhecido como, para todos os valores nessa sequência, a proporção entre os termos nunca é maior que 2 (a média fica em torno de 1,839).
Como escrever neste sistema de representação numérica
Digamos que você use uma representação little-endian. Alinhe os membros da sequência da seguinte maneira:
1 2 3 6 11 20 37 68
Então, você pega seu número para ser representado (para nossos testes, digamos que seja 63
) e encontra os valores dos 1-2-3-Tribonacci fornecidos, que somam 63 (usando os maiores valores primeiro!) . Se o número fizer parte da soma, coloque 1 abaixo, 0 se não.
1 2 3 6 11 20 37 68
0 0 0 1 0 1 1 0
Você pode fazer isso para qualquer número inteiro - basta verificar se você usa primeiro os maiores valores abaixo de sua entrada!
Definição (finalmente)
Escreva um programa ou função que faça o seguinte, com alguma entrada inteira positiva n
(escrita em qualquer base padrão) entre 1 e o valor máximo do seu idioma:
- Converta o valor na representação numérica do 1-2-3-Tribonacci definida.
- Usando essa representação binária, e leia-a como se fosse binária. Isso significa que os dígitos permanecem os mesmos, mas o que eles significam muda.
- Pegue esse número binário e converta-o na base do número original.
- Envie ou retorne esse novo número.
No entanto, enquanto a saída for válida, você não precisará seguir estas etapas. Se você encontrar magicamente uma fórmula mais curta (e matematicamente equivalente), fique à vontade para usá-la.
Exemplos
Deixe a função f
ser a função descrita pela definição e []
represente as etapas executadas (como little-endian, embora não deva importar) (você não precisa seguir esse processo, este é apenas o processo descrito):
>>> f(1)
[1]
[1]
[1]
1
>>> f(5)
[5]
[0, 1, 1]
[6]
6
>>> f(63)
[63]
[0, 0, 0, 1, 0, 1, 1]
[104]
104