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

2se 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 (-pl61bandera) = 67 bytesUtilizando:
Sin golf:
Ideone .
fuente
061es 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:
Qse asigna con el número de entrada.La parte
h.WgQeH,eZsZ1calcula el mayor número de Fibonacci, que es menor o igual aQEntonces
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:
aes el número de Fibonacci anteriorbes el número actual de Fibonaccices la entradafes 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
$flos 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\argaplica 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 0genera 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\argsaplica 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