Antecedentes
Una secuencia fractal es una secuencia de enteros donde puede eliminar la primera aparición de cada entero y terminar con la misma secuencia que antes.
Una secuencia muy simple de este tipo se llama paráfrasis de Kimberling . Empiezas con los números naturales positivos:
1, 2, 3, 4, 5, 6, 7, 8, 9, ...
Luego, revuelves algunos espacios en blanco:
1, _, 2, _, 3, _, 4, _, 5, _, 6, _, 7, _, 8, _, 9, ...
Y luego rellena repetidamente los espacios en blanco con la secuencia misma (incluidos los espacios en blanco):
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, ...
Esa es nuestra secuencia fractal! Ahora tomemos las sumas parciales:
1, 2, 4, 5, 8, 10, 14, 15, 20, 23, 29, 31, 38, 42, 50, 51, 60, ...
Pero, ¿qué pasa si iteramos este proceso? "Fractalice" la nueva secuencia (es decir, las sumas parciales obtenidas de los pasos anteriores):
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, ...
Y tome nuevamente las sumas parciales:
1, 2, 4, 5, 9, 11, 16, 17, 25, 29, 39, 41, 55, 60, 75, 76, 96, ...
Enjuague, repita. Resulta que este proceso converge. Cada vez que repita este proceso, un prefijo más grande de la secuencia permanecerá fijo. Después de una cantidad infinita de iteraciones, terminaría con OEIS A085765 .
Dato curioso: este proceso convergería a la misma secuencia incluso si no comenzáramos desde los números naturales siempre que la secuencia original comience con 1
. Si la secuencia original comienza con cualquier otra x
, obtendríamos en su x*A085765
lugar.
El reto
Dado un entero positivo N
, genera el N
elemento th de la secuencia convergente.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), valor de retorno de la función o parámetro de función (out).
Puede elegir si el índice N
está basado en 0 o 1.
Casos de prueba
La secuencia comienza con:
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
Entonces la entrada 5
debería dar como resultado la salida 9
.
Aquí hay una ingenua implementación de referencia de CJam que genera los primeros N
números (dados N
en STDIN). Tenga en cuenta que su código solo debe devolver el N
elemento th, no el prefijo completo.
N
término de A085765 , ¿correcto?Respuestas:
CJam (
2322 bytes)Las sumas parciales se dan en los índices pares de la secuencia fractal, que es A086450 . La recurrencia dada allí como la definición de A086450 es la base de estas implementaciones.
Usando una "pila" explícita (entre comillas de miedo porque no es LIFO):
Demostración en línea
Disección
Con 23 bytes hay un enfoque mucho más eficiente, con la memorización:
Demostración en línea
fuente
f(0) = 1; f(n) = f(n/2) + (n % 2 ? 0 : f(n-2)); return f(2*x)
, pero no puedo encontrar una manera de ahorrar con ese enfoque en CJam.Pitón 2,
55 4942No tengo idea de lo que está sucediendo, pero parece difícil superar la fórmula de Maple de la página OEIS. Esto usa indexación basada en 0.
Gracias a @PeterTaylor por -6 bytes.
fuente
or
son efectivamenteg(n,1) = f(n/2,n%2); g(n,0) = f(n-1) + g(n,1)
; para que pueda sacar lo comúng(n,1)
para obtenerf=lambda n,t=0:n<1or f(n/2,n%2)+0**t*f(n-1)
Haskell, 65
fuente
Plantillas consideradas dañinas , 124
Esta es una función anónima. Es más o menos lo mismo que
mi respuesta de Pythonla fórmula Maple en la página OEIS, excepto que no implementé el módulo, por lo que tuve que usar nn / 2 * 2 en lugar de n% 2.Expandido:
fuente
Mathematica,
4744 bytesfuente
Matlab
108103Estoy usando el hecho de que la serie deseada es la suma parcial de https://oeis.org/A086450
Pero la complejidad de cálculo de mi implementación está lejos de ser óptima, incluso para esta simple recurrencia.
fuente