Tu tarea:
Escriba un programa o función para verificar si un número ingresado es un número de Fibonacci . Un número de Fibonacci es un número contenido en la secuencia de Fibonacci.
La secuencia de Fibonacci se define como:
F(n) = F(n - 1) + F(n - 2)
Con las semillas siendo F(0) = 0
y F(1) = 1
.
Entrada:
Un entero no negativo entre 0 y 1,000,000,000 que puede o no ser un número de Fibonacci.
Salida:
Un valor verdadero / falso que indica si la entrada es o no un número de Fibonacci.
Ejemplos:
0-->truthy
1-->truthy
2-->truthy
12-->falsy
Puntuación:
Este es el código de golf , gana el conteo de bytes más bajo.
code-golf
sequence
decision-problem
fibonacci
Gryphon - Restablece a Monica
fuente
fuente
Respuestas:
Neim , 2 bytes
Explicación:
Funciona igual que mi respuesta It's Hip to be Square , pero usa una lista infinita diferente:
f
para fibonacci.¡Intentalo!
fuente
66 D5
JavaScript (ES6), 34 bytes
Genera recursivamente la secuencia de Fibonacci hasta que encuentra un elemento mayor o igual a la entrada, luego devuelve el elemento == entrada.
fuente
Retina , 23 bytes
Pruébalo en línea!
Entrada en unario, salidas
0
o1
.Explicación
La secuencia de Fibonacci es un buen candidato para una solución con referencias directas, es decir, una "referencia inversa" que se refiere a un grupo circundante o uno que aparece más adelante en la expresión regular (en este caso, en realidad estamos usando ambos). Al hacer coincidir números como este, necesitamos encontrar una expresión recursiva para la diferencia entre los elementos de secuencia. Por ejemplo, para hacer coincidir números triangulares, generalmente hacemos coincidir el segmento anterior más uno. Para hacer coincidir los números cuadrados (cuyas diferencias son los números impares), hacemos coincidir el segmento anterior más dos.
Como obtenemos los números de Fibonacci agregando el penúltimo elemento al último, las diferencias entre ellos también son solo los números de Fibonacci. Por lo tanto, debemos hacer coincidir cada segmento como la suma de los dos anteriores. El núcleo de la expresión regular es este:
Ahora esto termina la adición de los números de Fibonacci a partir de 1 , es decir, 1, 1, 2, 3, 5, ... . Los que se suman a 1, 2, 4, 7, 12, ... . Es decir, son uno menos que los números de Fibonacci, por lo que agregamos un
1
al final. El único caso que esto no cubre es cero, por lo que tenemos la^$
alternativa al principio para cubrir eso.fuente
^$|^(^1|\2?+(\1))*1$
^
.Regex (sabor ECMAScript),
392358328224206165 bytesLas técnicas que deben entrar en juego para unir los números de Fibonacci con una expresión regular ECMAScript (en unario) están muy lejos de cómo se hace mejor en la mayoría de los otros sabores de expresiones regulares. La falta de referencias hacia atrás / anidadas o recursividad significa que es imposible contar directamente o mantener un total acumulado de cualquier cosa. La falta de mirar atrás hace que a menudo sea un desafío incluso tener suficiente espacio para trabajar.
Muchos problemas deben abordarse desde una perspectiva completamente diferente, y parecen irresolubles hasta la llegada de alguna idea clave. Te obliga a echar una red mucho más amplia para encontrar qué propiedades matemáticas de los números con los que estás trabajando podrían usarse para resolver un problema en particular.
En marzo de 2014, esto es lo que sucedió con los números de Fibonacci. Mirando la página de Wikipedia, inicialmente no pude encontrar una manera, aunque una propiedad en particular parecía tentadoramente cercana. Luego, el matemático teukon describió un método que dejó bastante claro que sería posible hacerlo, utilizando esa propiedad junto con otra. Era reacio a construir realmente la expresión regular. Su reacción cuando seguí adelante y lo hice:
Al igual que con mis otras publicaciones de expresiones regulares de matemáticas unitarias de ECMAScript, daré una advertencia: recomiendo aprender a resolver problemas matemáticos unarios en expresiones regulares de ECMAScript. Ha sido un viaje fascinante para mí, y no quiero estropearlo para cualquiera que quiera probarlo ellos mismos, especialmente aquellos que estén interesados en la teoría de números. Vea esa publicación para obtener una lista de problemas recomendados consecutivamente etiquetados con spoiler para resolver uno por uno.
Así que no sigas leyendo si no quieres que se te estropee la magia de expresiones regulares unarias . Si desea intentar descubrir esta magia usted mismo, le recomiendo comenzar resolviendo algunos problemas en la expresión regular de ECMAScript como se describe en la publicación vinculada anteriormente.
El desafío que enfrenté inicialmente: un número entero positivo x es un número de Fibonacci si y solo si 5x 2 + 4 y / o 5x 2 - 4 es un cuadrado perfecto. Pero no hay espacio para calcular esto en una expresión regular. El único espacio en el que tenemos que trabajar es el número mismo. Ni siquiera tenemos suficiente espacio para multiplicar por 5 o tomar el cuadrado, y mucho menos ambos.
La idea de teukon sobre cómo resolverlo ( originalmente publicado aquí ):
Y aquí hay una maqueta del algoritmo en C que escribí como prueba antes de implementarlo en regex.
Entonces, sin más preámbulos, aquí está la expresión regular:
^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$
Pruébalo en línea!
Y la versión comentada y muy impresa:
El algoritmo de multiplicación no se explica en esos comentarios, pero se explica brevemente en un párrafo de mis abundantes números de expresiones regulares .
Estaba manteniendo seis versiones diferentes de la expresión regular de Fibonacci: cuatro que se mueven de la longitud más corta a la velocidad más rápida y usan el algoritmo explicado anteriormente, y otras dos que usan un algoritmo diferente, mucho más rápido pero mucho más largo, que como encontré en realidad puede volver el índice de Fibonacci como una coincidencia (explicar que el algoritmo aquí está más allá del alcance de esta publicación, pero se explica en la discusión original Gist ). No creo que vuelva a mantener tantas versiones muy similares de una expresión regular, porque en ese momento estaba haciendo todas mis pruebas en PCRE y Perl, pero mi motor de expresión regular es lo suficientemente rápido como para que las preocupaciones sobre la velocidad ya no sean tan importantes (y si una construcción en particular está causando un cuello de botella, puedo agregar una optimización), aunque probablemente volvería a mantener una versión más rápida y una versión más corta, si la diferencia en velocidad eran lo suficientemente grandes.
La versión "devolver el índice de Fibonacci menos 1 como un partido" (no muy golfizado):
Pruébalo en línea!
Todas las versiones están en github con el historial completo de las optimizaciones de golf:
regex para hacer coincidir los números de Fibonacci - corto, velocidad 0.txt (el más corto pero más lento, como en esta publicación)
regex para hacer coincidir los números de Fibonacci - corto, velocidad 1.txt
regex para hacer coincidir los números de Fibonacci - corto, velocidad 2.txt
regex para números de Fibonacci coincidentes - corto, velocidad 3.txt
regex para hacer coincidir los números de Fibonacci - más rápido.txt
regex para hacer coincidir los números de Fibonacci - return index.txt
fuente
Python 3 , 48 bytes
Pruébalo en línea!
fuente
int
establecería la barra más alta (aún no es arbitrariamente grande), pero tampoco forzamos las respuestas de C para usar enteros de 64 bits (o 128 bits con gcc). En cualquier caso, tener permiso para usar el mismo algoritmo en un idioma pero no en otro parece absurdo.Python 2,
4844 bytesPruébalo en línea
Gracias a Jonathan Allan por guardar 4 bytes.
fuente
False
y los valores falsosTrue
: TIO!n-a
en lugar den==a
y tener -1 y 0 como sus valores de retorno.-101
o algún otro resultado en lugar de-1
.05AB1E ,
87 bytesExplicación:
Pruébalo en línea!
-1 gracias a Jonathan Allan por la solución de 0-no-un-fibonacci-número.
fuente
n
(guardar un byte) comoÅF
es inclusivo y¹å
resultaría de0
cualquier maneran=0
?Perl 6 , 23 bytes
fuente
{(0,1,*+*...^*>$_).tail==$_}
era lo que iba a publicar inicialmente. Puede que haya llegado a establecer operadores eventualmente.En serio , 3 bytes
Pruébalo en línea!
Devuelve el índice +1 en la lista de números de Fibonacci si es verdadero; de lo contrario, devuelve falso.
Explicación:
fuente
Jalea ,
8 76 bytesPruébalo en línea!
¿Cómo?
Notas:
‘
se necesita por lo que esto funciona para 2 y 3 , ya que son la 3 ª y 4 ª números de Fibonacci - más allá de 3 todos los números de Fibonacci son mayores que su índice.-
que se necesita (y no sólo‘R
) por lo que esto funciona para 0 desde 0 es el 0 º número de Fibonacci;fuente
3
:)ZX81 BÁSICO
180151100~ 94 bytes tokenized BASICGracias a Moggy en los foros de SinclairZXWorld, aquí hay una solución mucho más ordenada que ahorra más bytes.
Esto generará 1 si se ingresa un número de Fibonacci, o cero si no. Aunque esto ahorra bytes, es mucho más lento que las soluciones anteriores a continuación. Para la velocidad (pero más bytes BÁSICOS) elimine los
VAL
contenedores alrededor de los números literales de cadena. Aquí están las soluciones antiguas (er) con algunas explicaciones:Las enmiendas anteriores ahorran más bytes BÁSICOS para condensar las
IF
declaraciones en una solaPRINT
en la línea 12; otros bytes se guardaron usando laVAL
palabra clave y, y usandoGOTO CODE "£"
, que en el conjunto de caracteres ZX81 es 12. Las cadenas guardan más bytes sobre los números ya que todos los valores numéricos se almacenan como flotantes, por lo que ocupan más espacio en la pila VAR.fuente
5 IF R<F THEN NEXT I
- ¡lo malo!C #, 109 bytes
Definitivamente podría mejorarse, pero no tuve tiempo.
fuente
n=>{int a=0,b=1,c=0;while(a<n&b<n)if(++c%2>0)a=a+b;else b=a+b;return a==n|b==n;}
(solo 80 bytes). Pruébalo en línea!a+=b
lugar dea=a+b
y enb+=a
lugar deb=a+b
.> <> ,
2119 + 3 =2422 bytesSe espera que la entrada esté en la pila al inicio del programa, por lo que +3 bytes para el
-v
indicador.Pruébalo en línea!
Esto funciona generando números de Fibonacci hasta que sean mayores o iguales que el número de entrada, luego verificando el último número generado para la igualdad con la entrada. Salidas
1
si era un número de Fibonacci, de lo0
contrario.Para garantizar que
0
se maneja correctamente, la semilla es-1 1
: el primer número generado será en0
lugar de1
.Gracias a @cole por señalar que
i
se puede usar para empujar-1
a la pila cuando STDIN está vacío. ¡Muy inteligente!Versión previa:
fuente
i
lugar de01-
.i
como-1
cuando no hay entrada para STDIN, no lo había considerado. ¡Bien hecho!Mathematica, 37 bytes
-4 bytes de @ngenisis
fuente
Fibonacci[0]
da0
, para que pueda guardar4
bytes al incluirlos0
en elTable
rango. Puede guardar otro byte usando la notación infija paraTable
:!Fibonacci@n~Table~{n,0,#+1}~FreeQ~#&
MATL (16 bytes)
Pruébalo en línea!
No es la solución más elegante, pero quería usar el método directo para verificar si "5 * x ^ 2 +/- 4" es un cuadrado perfecto .
Explicación:
Nota:
En el caso "0" devuelve "2" porque 4 y -4 son cuadrados perfectos, lo mismo con 1 que produce "1 1". Considere cualquier salida que no sea cero como "verdadero" y 0 como "falso".
fuente
Pari / GP , 32 bytes
Pruébalo en línea!
fuente
PHP , 44 bytes
Pruébalo en línea!
PHP , 58 bytes
Pruébalo en línea!
fuente
for(;0>$s=$x-$argn;)$x=+$y+$y=$x?:1;echo!$s;
.Java,
7269686359555049 bytes¡Pruébalo tú mismo!
Alternativa (todavía 49 bytes)
No muy original: es la versión iterativa simple y básica.
Esto funciona para números hasta 1,836,311,903 (número 47 de Fibonacci) incluido. Por encima de eso, el resultado es indefinido (incluido un bucle infinito potencial).
Gracias a Kevin Cruijssen y David Conrad por ayudar al golf :)
fuente
n==0
an<1
. En la pregunta dice " Un número entero no negativo entre 0 y 1,000,000,000 ".b+=a;a=b-a;
C # (.NET Core) , 51 bytes
Pruébalo en línea!
-6 bytes gracias a @Oliver!
Esta solución utiliza una función recursiva bastante sencilla.
n
es el número a probar.a
yb
son los 2 números más recientes en la secuencia.El enlace TIO demuestra que esto funciona para 1134903170 que excede el valor máximo requerido por el desafío.
fuente
a<n
de 51 bytesAlquimista ,
205134bytes¡Muchas gracias a ASCII-only por la fusión de estados bastante inteligente, ahorrando 71 bytes!
¡Pruébelo en línea o verifique en lote!
Sin golf
fuente
0
comprobaciones por menos bytes a costa del no determinismob
-atom Durante el inicio de la fija (y ahorra 2 bytes): D, graciasJalea , 5 bytes
Pruébalo en línea!
Devuelve 0 para números que no son de Fibonacci y la posición indexada en 1 del número en la secuencia de Fibonacci para números de Fibonacci.
Explicación:
fuente
Dyalog APL, 17 bytes
Pruébalo en línea!
fuente
R,
4340 bytespryr::f
crea una función:Se utiliza
DescTools::Fibonacci
para crear los primerosx+1
números de Fibonacci y se verifica su inclusión.x+1
porque el tercer fibno es 2, y eso no sería suficiente para verificar la inclusión de 3.Afortunadamente
Desctools::Fibonacci(0)=0
, ese es un lindo regalo.-3 bytes gracias a MickyT
fuente
-1:x+1
te ahorrará un byte, pero0:45
te ahorrará tres y cubrirá el rango requeridopryr::f(any(!(5*n^2+c(-4,4))^.5%%1))
.pryr
.Haskell , 31 bytes
Pruébalo en línea! Esto explota el hecho de que la entrada estará en el rango de 0 a 1,000,000,000, por lo tanto, necesitamos verificar solo los primeros 45 números de Fibonacci.
f=0:scanl(+)1f
genera una lista infinita de números de Fibonacci,take 45f
es la lista de los primeros 45 números de Fibonacci yelem
comprueba si la entrada está en esta lista.Versión sin restricciones: 36 bytes
Pruébalo en línea! Para cualquier
n
, tomar los primerosn+3
números de Fibonacci garantizará quen
estarán en esta lista si se trata de un número de Fibonacci.Tenga en cuenta que este enfoque es increíblemente ineficiente para los números altos que no son números de Fibonacci, porque todos los
n+3
números de Fibonacci deben calcularse.fuente
Javascript (ES6 sin el operador **), 44 bytes
Se basa en la relación entre los sucesivos números de Fibonacci que se aproximan a la proporción áurea. El valor de c es la parte fraccionaria de la entrada dividida por la proporción áurea; si la entrada es Fibonacci, entonces será muy cercana a 1 y el valor de c-c² será muy pequeño.
No es tan corto como algunas de las otras respuestas de JS, pero se ejecuta en tiempo O (1).
fuente
Julia 0.4 , 29 bytes
Pruébalo en línea!
Si no es así como respondes a Julia, avísame. No estoy seguro de cómo funciona la entrada en TIO.
fuente
!m=
) o una lambda (contarm->
). Más importante aún, esto falla para 0 como está.R,
3231 bytesToma información de stdin, devuelve
TRUE
oFALSE
según corresponda.fuente
Lisp común,
6154 bytesPruébalo en línea!
La reducción de tamaño con respecto a la versión anterior:
fue provocado por la idea de que para generar la secuencia de los números de Fibonacci solo son necesarias dos variables, no tres.
fuente
Mathematica, 33 bytes
fuente
@*
(y luego soltar el final@#&
)JS (ES6), 57 bytes
Utiliza el método de carusocomputing . Mucho más golfier que mi otra respuesta .
Sin golf
fuente