Fondo
La mayoría de ustedes saben qué es un número de Fibonacci . Algunos de ustedes pueden saber que todos los enteros positivos se pueden representar como una suma de uno o más números distintos de Fibonacci, de acuerdo con el Teorema de Zeckendorf . Si el número de términos en la representación óptima de Zeckendorf de un número entero n
es en sí mismo un número de Fibonacci, llamaremos a n
Fibonacci "en secreto".
Por ejemplo:
139 = 89 + 34 + 13 + 3
This is a total of 4 integers. Since 4 is not a Fibonacci number, 139 is not secretly Fibonacci
140 = 89 + 34 + 13 + 3 + 1
This is a total of 5 integers. Since 5 is a Fibonacci number, 140 is secretly Fibonacci
Notas
- La representación óptima de Zeckendorf se puede encontrar utilizando un algoritmo codicioso. Simplemente tome el número de Fibonacci más grande <= n y reste de n hasta llegar a 0
- Todos los números de Fibonacci se pueden representar como la suma de 1 número de Fibonacci (sí mismo). Como 1 es un número de Fibonacci, todos los números de Fibonacci también son secretamente Fibonacci.
Reto
Su desafío es escribir un programa o función que tome un entero y devuelva si ese entero es secretamente Fibonacci.
Entrada
Puede tomar información en cualquier formato razonable. Puede suponer que la entrada será un solo entero positivo.
Salida
Produzca uno de dos resultados distintos para saber si la entrada es secretamente Fibonacci. Los ejemplos incluyen True
/ False
, 1
/ 0
, etc.
Tanteo
Este es el código de golf , por lo que la respuesta más corta en bytes gana Las lagunas estándar están prohibidas.
Casos de prueba
Truthy (secretly Fibonacci)
1
2
4
50
140
300099
Falsey (NOT secretly Fibonacci)
33
53
54
139
118808
fuente
Respuestas:
JavaScript (Node.js) , 54 bytes
Pruébalo en línea!
fuente
Python 2 , 77 bytes
Pruébalo en línea!
Esto utiliza el teorema de que las dos descripciones de OEIS A003714 son equivalentes:
z
Luego queda comprobar si
z[n]
es un número de Fibonacci, es decirz[z[n]] == 1
.fuente
bin(x)
. También puede eliminar uno cambiandorange(n*n+1)
arange(n<<n)
. (Suponiendo que 0 no es válido)bin(x)
, jaja. Y, hm,1<<n
ya es más que suficiente, pero me gustaría mantener el tiempo de ejecución no astronómicoGelatina , 15 bytes
Un enlace monádico que acepta un número entero no negativo que produce
1
"Secret Fibonacci" y lo0
contrario.Pruébalo en línea! (demasiado ineficiente para los casos de prueba más grandes)
¿Cómo?
fuente
R , 83 bytes
Pruébalo en línea!
fuente
C # (.NET Core) ,
12411598 bytesPruébalo en línea!
-3 bytes: cambiado mientras bucle a for (gracias a Olivier Grégoire )
-6 bytes: retornos cambiados para usar variables, inicializadas byc fuera de los bucles (gracias a Kevin Cruijssen )
-17 bytes: condición cambiada en el segundo bucle para mover si fuera de bucle y combinar con retorno, reutilizado byc variables en el último bucle (gracias a raznagul )
Sin golf:
fuente
for(;c<=a;b=c-b)c+=b;
te ahorrará 3 bytes.{}
Eliminé todos los soportes de tus bucles y puse todo enfor
bucles. Además, agregué una variabler
que configuramos1
en suif(e==n)
y regresamos al final, por lo que solo tiene unareturn
.e<n
, puede mover elif
a después del bucle y, en consecuencia, combinarlo con elreturn
de 101 bytes .b
yc
en el último bucle y eliminandod
ye
.Perl 6 , 58 bytes
Pruébalo en línea!
1, &[+] ... * > $_
es solo la secuencia de Fibonacci, detenida en un lugar conveniente no infinito (el número de entrada).$_, { $^n - (1, &[+] ...^ * > $n).tail } ... 0
es una secuencia de números, comenzando con el número de entrada, y cada elemento sucesivo se obtiene restando el número de Fibonacci más grande menor o igual que el elemento anterior del elemento anterior. La secuencia termina cuando0
se alcanza. Por ejemplo, si$_
es140
, entonces esta secuencia es140, 51, 17, 4, 1, 0
.Restar uno de esta secuencia lo trata como un número, su longitud y la diferencia es el número de números de Fibonacci que, sumados, dan el número de entrada. Luego, se verifica la membresía de este número en la primera secuencia de Fibonacci.
fuente
&[+]
anterior! Buen ahorro al no tener que definir dos términos inicialesPerl 6 , 48 bytes
Pruébalo en línea!
Transforma la entrada en una lista de Representación de Zeckendorf repetidamente hasta que alcanza un solo número y luego verifica si la longitud de la secuencia fue menor a 4.
La función Zenckendorf en el medio proviene principalmente de la respuesta de Sean con un par de mejoras.
Explicación:
Por ejemplo, la secuencia para
2
es2 1
ya2
que ya es un número de Fibonacci. La secuencia para140
es140 5 1
, y dado que 5 es un número de Fibonacci, esto devuelve verdadero. La secuencia para33
es33 4 2 1
, y dado4
que no es un número de Fibonacci, la secuencia es de longitud 4.fuente
05AB1E , 14 bytes
Pruébalo en línea . No hay un conjunto de pruebas para todos los casos de prueba, porque
counter_variable
no se puede restablecer a 0 .. Sin embargo, verifiqué todo a mano y son correctos.Explicación:
NOTA: El
counter_variable
sería5
para entrada139
y6
para entrada140
, porque para que elΔ
bucle compruebe que la pila permaneció igual, por supuesto, hace una iteración adicional.fuente
Haskell , 64 bytes
Pruébalo en línea!
fuente
Retina 0.8.2 , 61 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Convierte a unario.
Cuente el número de números de Fibonacci necesarios.
La primera alternancia trata con números de Fibonacci que son al menos 2. En el primer pase,
\2
todavía no existe, pero afortunadamente es opcional, por lo que no tenemos que igualarlo.\1
tampoco existe, pero afortunadamente tenemos la alternativa de\G.
que coincida con un solo personaje al comienzo de la partida. Ambos\2
y,\1
por lo tanto, toman el valor 1.En pases posteriores,
\2
existe, por lo que intentamos igualarlo. Esta vez, si falla,\1
también falla (ya que es más grande que\2
), pero si tiene éxito,(?>)
evita el retroceso, por lo que si\2
coincide pero\1
no, no lo intentamos solo\1
. (\G1
siempre falla porque hemos avanzado más allá del inicio del parche). Finalmente\2
adquiere el valor anterior de\1
while\1
toma la suma de los dos valores.Por lo tanto, combinamos tantos números de Fibonacci como podamos, sumando a medida que avanzamos. Desde las sumas parciales de la secuencia
1, 2, 3, 5...
son0, 1, 3, 6, 11...
ejemplo, 2 menos que los números de Fibonacci, terminamos haciendo coincidir 2 al final.Obviamente, esto no coincide con 1 en sí mismo, por lo que una alternancia maneja ese caso.
Convierte a unario.
Prueba si este es un número de Fibonacci. Esto usa la misma idea que la primera prueba pero usa en
^
lugar de\G
y también tenemos que coincidir exactamente, por lo que usa una captura opcional en lugar de una alternancia, ya que es más golfista (pero aumenta los números de captura en 1).Retina , 35 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Convierte a unario.
Cuente el número de números de Fibonacci necesarios. (En bucle, tanto la conversión como el recuento ahorran un byte completo al obtener el recuento en unario en primer lugar).
Realice los pasos anteriores dos veces en total. Esto toma el recuento de números de Fibonacci necesarios para sumar el recuento de números de Fibonacci.
Si el número era secretamente Fibonacci, entonces el resultado es 1.
fuente
Python 2 ,
146137 bytesPruébalo en línea!
f () es una función recursiva que devuelve el valor del enésimo número de Fibonacci. Tomado de esta respuesta .
g () es una función recursiva que devuelve la representación de Zeckendorf del número dado como una lista de enteros.
Dado que todos los números de Fibonacci tendrán una longitud de retorno de un elemento de g (), h () verifica si la longitud de la g () de g (n) == 1.
EDITAR: guardado 9 bytes gracias a nedla2004 . Siempre olvido que las lambdas no siempre son la mejor solución ...
fuente
g
una función para poder definirf(n-1)
una variable. Pareja otros cambios de==
a<
donde ellos son los mismos.