Puede descomponer un número mayor que 0 como una suma única de números positivos de Fibonacci. En esta pregunta, hacemos esto restando repetidamente el mayor número positivo posible de Fibonacci. P.ej:
1 = 1
2 = 2
3 = 3
4 = 3 + 1
12 = 8 + 3 + 1
13 = 13
100 = 89 + 8 + 3
Ahora, llamo a un producto de Fibonacci las mismas listas que arriba, pero con la suma reemplazada por multiplicación. Por ejemplo, f(100) = 89 * 8 * 3 = 2136
.
Escriba un programa o función que dado un número entero positivo n devuelva el producto de Fibonacci de ese número.
Casos de prueba:
1: 1
2: 2
3: 3
4: 3
5: 5
6: 5
7: 10
8: 8
9: 8
42: 272
1000: 12831
12345: 138481852236
code-golf
math
sequence
fibonacci
code-golf
word
code-golf
cipher
code-golf
string
math
subsequence
code-golf
regular-expression
code-golf
brainfuck
assembly
machine-code
x86-family
code-golf
math
factorial
code-golf
math
geometry
code-golf
math
arithmetic
array-manipulation
math
number
optimization
stack
metagolf
code-golf
tips
assembly
code-golf
tips
lisp
code-golf
number-theory
path-finding
code-golf
number
sequence
generation
code-golf
math
geometry
code-golf
grid
permutations
code-golf
code-golf
graphical-output
geometry
fractal
knot-theory
code-golf
math
arithmetic
code-golf
interpreter
balanced-string
stack
brain-flak
code-golf
math
set-theory
code-golf
math
array-manipulation
code-golf
code-golf
string
natural-language
code-golf
code-golf
math
linear-algebra
matrix
code-golf
string
encode
orlp
fuente
fuente
2
se puede descomponer como-1 + 3
. La afirmación correcta del teorema de Zeckendorf es que un número positivo de Fibonacci puede descomponerse de manera única como una suma de números de Fibonacci no consecutivos con índice positivo.Respuestas:
Jalea ,
1615 bytesNo es particularmente rápido ni amigable con la memoria, pero lo suficientemente eficiente para todos los casos de prueba. Pruébalo en línea!
Cómo funciona
fuente
Python, 54 bytes
Solo una buena y vieja recursión.
fuente
Perl,
6963 + 4 (-pl61
bandera) = 67 bytesUtilizando:
Sin golf:
Ideone .
fuente
061
es la codificación ASCII para el carácter'1'
. Buen truco para usar$\
para imprimirlo casi gratis.JavaScript (ES6),
7842 bytesPuerto de la respuesta de @ Sp3000. Versión original de 78 bytes:
fuente
> <> , 57 bytes
Espera que el número de entrada esté presente en la pila al inicio del programa.
Desarrolla la secuencia de Fibonacci (
f0, f1, f2, ..., fn
) en la pila hasta que se alcanza un número que es mayor que la entrada (i
). Luego, con un producto (p
) inicializado a1
...Pruébelo en línea!
fuente
Pyth, 28 bytes
Creo que se puede jugar mucho más golf ...
Pruébalo en línea!
fuente
Pyth, 24 bytes
Pruébelo en línea: Demostración o conjunto de pruebas
Explicación:
Q
se asigna con el número de entrada.La parte
h.WgQeH,eZsZ1
calcula el mayor número de Fibonacci, que es menor o igual aQ
Entonces
Q = 10
, si , genera los números / pares:El resto del código calcula la partición y multiplica los números:
Obviamente, hay muchas soluciones más cortas (con tiempos de ejecución realmente malos), como
*FhfqQsTyeM.u,eNsNQ1
.fuente
Haskell, 44 bytes
Yay por recursión mutua:
a
es el número de Fibonacci anteriorb
es el número actual de Fibonaccic
es la entradaf
es la función deseadaMenos golfizado:
fuente
En realidad, 22 bytes
Pruébalo en línea!
Explicación:
fuente
Javascript (ES6)
13410692 bytesGracias por @cat por ver un espacio.
Solo una versión no optimizada hecha en mi teléfono, la uso una vez que llego a casa. Las ideas son bienvenidas.
fuente
RETORNO , 44 bytes
Try it here.
Asombrosamente ineficiente lambda anónima que deja resultado en Stack2. Uso:
NOTA: ␌ y ␁ son marcadores de posición para sus respectivos caracteres no imprimibles: avance de formulario y comienzo de encabezado .
Explicación
fuente
PHP, 119 bytes
El código (envuelto en dos líneas para facilitar la lectura):
La primera línea calcula en
$f
los números de Fibonacci más pequeños que$n
(el argumento proporcionado en la línea de comando). La segunda línea calcula los factores de Fibonacci (por sustracción) y los multiplica para calcular el producto$o
.Anteponga el código con
<?php
(técnicamente no forma parte del programa), póngalo en un archivo (fibonacci-factors.php
) y ejecútelo como:O ejecutarlo usando
php -d error_reporting=0 -r '... code here ...' 100
.El código no protegido y el conjunto de pruebas se pueden encontrar en Github .
fuente
Q, 47 bytes
Prueba
léalo como pares (i, map (m, i)), donde m es la función de cálculo e i los diferentes argumentos
escribe
Explicación
n funtion\arg
aplica function (function (function (... function (args))) n veces (usa internamente recursión tal) y devuelve la secuencia de resultados. Calculamos los 60 primeros elementos de la serie fibonnaci como*+60(|+\)\1 0
. En ese caso, la función es ( | +): + \ aplicado sobre una secuencia calcula sumas parciales (por ejemplo, + \ 1 2 3 es 1 3 6) e invierte la secuencia. Por lo tanto, cada 'iteración' calculamos sumas parciales de los dos números de Fibonacci anteriores y devuelve el parcial sumas invertidas.60(|+\)\1 0
genera secuencias 1 0, 1 1, 2 1, 3 2, 5 3, 8 5, 13 8, 21 13, ...*+
aplicadas sobre este resultado, voltéalo (traspónsalo) y toma el primero. El resultado es la secuencia 1 1 2 3 5 8 13 21 34 55 ..(cond)function\args
aplica function (function (.. function (args))) mientras cond verdadero, y devuelve la secuencia de resultados parcialesfunction[arg]
aplicado sobre una función de más de un argumento crea una proyección (aplicación parcial)Podemos dar nombre a los argumentos, pero los nombres implícitos son x, y, z
{y-x x bin y}[*+60(|+\)\1 0]
declara una lambda con args x, y con proyección parcial (arg x es una serie de Fibonacci, calcula como * + 60 (| +) \ 1 0). x representa los valores de Fibonacci, yy el número a procesar. La búsqueda binaria (bin) se usa para ubicar el índice del mayor número de Fibonacci <= y (x bin y
) y restar el valor correspondiente de x.Para calcular el producto a partir de resultados parciales, los invertimos y calculamos la diferencia de cada par (
-':|
), soltamos el primero (1_
porque es 0) y lo multiplicamos (*/
).Si estamos interesados en la suma acumulada, el código es el mismo, pero con en
+/
lugar de*/
. También podemos usar cualquier otro operador diadic en lugar de + o *Sobre la eficiencia de ejecución
Sé que en este concurso la eficiencia no es un problema. Pero en este problema podemos variar desde el costo lineal hasta el costo exponencial, así que tengo curiosidad al respecto.
Desarrollé una segunda versión (48 bytes de longitud sin incluir comentarios) y repetí la batería de casos de prueba 1000 veces en ambas versiones.
el tiempo de ejecución es: versión original 0'212 seg, nueva versión 0'037 seg
La versión original calcula la serie fibbonaci una vez por aplicación de función; La nueva versión calcula Fibonacci solo uno.
En ambos casos, el cálculo de la serie de Fibonacci utiliza la recursión de la cola
fuente