fundo
Uma sequência fractal é uma sequência inteira, na qual é possível remover a primeira ocorrência de cada número inteiro e terminar com a mesma sequência de antes.
Uma sequência muito simples é chamada de paráfrases de Kimberling . Você começa com os números naturais positivos:
1, 2, 3, 4, 5, 6, 7, 8, 9, ...
Então você riffle em alguns espaços em branco:
1, _, 2, _, 3, _, 4, _, 5, _, 6, _, 7, _, 8, _, 9, ...
E então você preenche repetidamente os espaços em branco com a própria sequência (incluindo os espaços em branco):
1, 1, 2, _, 3, 2, 4, _, 5, 3, 6, _, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, _, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, 1, 9, ...
Essa é a nossa sequência fractal! Agora vamos pegar as somas parciais:
1, 2, 4, 5, 8, 10, 14, 15, 20, 23, 29, 31, 38, 42, 50, 51, 60, ...
Mas e se iterarmos esse processo? "Fractalize" a nova sequência (ou seja, as somas parciais obtidas nas etapas acima):
1, _, 2, _, 4, _, 5, _, 8, _, 10, _, 14, _, 15, _, 20, _, 23, ...
1, 1, 2, _, 4, 2, 5, _, 8, 4, 10, _, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, _, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, 1, 20, 8, 23, ...
E pegue as somas parciais novamente:
1, 2, 4, 5, 9, 11, 16, 17, 25, 29, 39, 41, 55, 60, 75, 76, 96, ...
Enxágüe, repita. Acontece que esse processo converge. Sempre que você repetir esse processo, um prefixo maior da sequência permanecerá fixo. Após uma quantidade infinita de iterações, você terminaria com o OEIS A085765 .
Curiosidade: esse processo convergiria para a mesma sequência, mesmo que não partíssemos dos números naturais, desde que a sequência original comece 1
. Se a sequência original começar com qualquer outrox
, x*A085765
obteríamos.
O desafio
Dado um número inteiro positivo N
, produza o N
th elemento da sequência convergida.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Você pode escolher se o índice N
é baseado em 0 ou 1.
Casos de teste
A sequência começa com:
1, 2, 4, 5, 9, 11, 16, 17, 26, 30, 41, 43, 59, 64, 81, 82, 108, 117, 147, 151, 192, 203, 246, 248, 307, 323, 387, 392, 473, 490, 572, 573, 681, 707, 824, 833, 980, 1010, 1161, 1165, 1357, 1398, 1601, 1612, 1858, 1901, 2149, 2151, 2458, 2517
Portanto, a entrada 5
deve resultar em saída 9
.
Aqui está uma implementação de referência ingênua do CJam que gera os primeiros N
números (fornecidos N
no STDIN). Observe que seu código deve retornar apenas o N
elemento th, não o prefixo inteiro.
N
termo th de A085765 , correto?Respostas:
CJam (
2322 bytes)As somas parciais são fornecidas nos índices pares da sequência fractal, que é A086450 . A recorrência dada como a definição de A086450 é a base para essas implementações.
Usando uma "pilha" explícita (entre aspas, porque não é LIFO):
Demonstração online
Dissecação
Aos 23 bytes, há uma abordagem muito mais eficiente, com a memória:
Demonstração online
fonte
f(0) = 1; f(n) = f(n/2) + (n % 2 ? 0 : f(n-2)); return f(2*x)
, mas não consigo encontrar uma maneira de economizar com essa abordagem no CJam.Python 2,
55 4942Eu não tenho idéia do que está acontecendo, mas parece difícil vencer a fórmula do Maple na página OEIS. Isso usa indexação baseada em 0.
Graças a @PeterTaylor por -6 bytes.
fonte
or
são efetivamenteg(n,1) = f(n/2,n%2); g(n,0) = f(n-1) + g(n,1)
; para que possa retirar o comumg(n,1)
para obterf=lambda n,t=0:n<1or f(n/2,n%2)+0**t*f(n-1)
Haskell, 65
fonte
Modelos considerados prejudiciais , 124
Esta é uma função anônima. É mais ou menos o mesmo que
minha resposta em Pythonà fórmula do Maple na página OEIS, exceto que eu não implementei o módulo, então tive que usar nn / 2 * 2 em vez de n% 2.Expandido:
fonte
Mathematica,
4744 bytesfonte
Matlab
108103Estou usando o fato de que a série desejada é a soma parcial de https://oeis.org/A086450
Mas a complexidade computacional da minha implementação está longe de ser ideal, mesmo para essa simples recorrência.
fonte