Probablemente hayas oído hablar de los números de Fibonacci. Ya sabes, esa secuencia entera que comienza con 1, 1
, y luego cada nuevo número es la suma de los dos últimos.
1 1 2 3 5 8 13...
Y así. Los desafíos sobre los números de Fibonacci son bastante populares aquí . ¿Pero quién dice que los números de Fibonacci tienen que comenzar 1, 1
? ¿Por qué no podían empezar 0, 1
? Muy bien, redefinímoslos para comenzar en 0:
0 1 1 2 3 5 8 13...
Pero ... ¡tampoco tenemos que parar allí! Si podemos sumar los dos últimos números para obtener el siguiente, también podríamos restar el primer número del segundo número para anteponer un nuevo número. Entonces podría comenzar con 1, 0
:
1 0 1 1 2 3 5 8 13...
Incluso podemos terminar con negativos:
-1 1 0 1 1 2 3 5 8 13...
Y esta serie también continúa para siempre. Creo que es interesante cómo termina reflejando los números normales de Fibonacci, solo con cualquier otro número negativo:
13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Llamemos a esta serie el "Número de Fibonacci extendido", o EFN . Como no hay realmente un número negativo obvio para comenzar esta serie, diremos que 0 aparece en 0 , los números regulares de Fibonacci se extienden a los índices positivos, y los números negativos de Fibonacci (¿medio negativos?) en los índices negativos, así:
Indices: ...-7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ...
Values: ...13 -8 5 -3 2 -1 1 0 1 1 2 3 5 8 13...
Esto lleva al desafío de hoy:
Dado un número entero N , devuelve cada índice en el que aparece N en la serie EFN .
Algunas observaciones aleatorias sobre esta tarea:
1 aparece más veces en el EFN que cualquier otro número:
[-1, 1, 2]
. Ningún número aparecerá en más de 3 lugares.Cada número de Fibonacci> 1 aparecerá una vez (3, 8, 21, etc.) o dos veces (2, 5, 13, etc.)
Aclaraciones de reglas:
- Si
abs(N)
no es un número de Fibonacci, nunca aparecerá en la serie EFN , por lo que no debe generar nada / una colección vacía si es posible, o si eso no es posible en su idioma, puede generar un valor no numérico constante. - Si N aparece en varios lugares en el EFN , su salida no necesita ser ordenada. Aunque cada índice debe aparecer exactamente una vez.
- Aunque la mayoría de los desafíos de secuencia le permiten elegir si desea usar la indexación basada en 1 o en 0, este desafío debe usar la indexación descrita (donde 0 aparece en 0).
- Puede tomar E / S a través de cualquier formato estándar.
Casos de prueba
-13: []
-12: []
-11: []
-10: []
-9: []
-8: [-6]
-7: []
-6: []
-5: []
-4: []
-3: [-4]
-2: []
-1: [-2]
0: 0
1: [-1, 1, 2]
2: [-3, 3]
3: [4]
4: []
5: [-5, 5]
6: []
7: []
8: [6]
9: []
10: []
11: []
12: []
13: [-7, 7]
Y algunos casos de prueba más grandes:
89: [-11, 11]
1836311903: [46]
10000: []
-39088169: [-38]
Como de costumbre, ¡la respuesta más corta en bytes gana!
Respuestas:
Haskell , 78 bytes
4 bytes guardados gracias a nimi
Pruébalo en línea!
Primero configuramos
(#)
,(#)
tomamos dos parámetrosa
yb
, y devolvemos una lista que comienza cona
y seguida porb#(a-b)
. Esto crea una lista infinita, pero debido a que Haskell es perezoso, no necesitamos preocuparnos de que se repita para siempre. Esto esencialmente funciona al revés creando la secuencia de Fibonacci antes de un cierto par. Por ejemplo(0#1)
, sería la lista de todos los números de Fibonacci con índice negativo.Desde aquí hacemos
f
.f
toma un argumentoa
que es el número que estamos tratando de encontrar en la secuencia. Aquí usamos lado
notación para hacer una lista de comprensión. Comenzamos tomando los primerosa*a+1
elementos de la lista0#1
1 . Dado que la funcióna*a+1
crece más rápido que el inverso de la secuencia de Fibonacci, podemos estar seguros de que si verificamos dentro de este límite, encontraremos todos los resultados. Esto nos impide buscar en una lista infinita. Luego, para cada valorx
e índicei
, six==a
encontramosa
en la mitad negativa de la secuencia, entonces regresamos-i
, y siabs x==a
regresamosi
también porque el valor absoluto de la mitad negativa es la mitad positiva, entonces lo encontramos allí.Ya que esto hace la lista
[0,0]
para0
que codificar la salida correcta para que uno.1: Este truco está tomado de la respuesta limpia Οurous ' . Las mismas aplies speedup aquí, ya que, reemplazan
a*a+1
conabs a+1
a ahorrar mucho tiempo.fuente
u
cona#b=a:b#(a-b)
plus0#1
ahorra un byte: ¡ Pruébelo en línea!Limpio ,
132120109 bytesPruébalo en línea!
g :: Int -> Int
Es la función de Fibonacci.? :: Int -> [Int]
solo indexa los elementos de la EFN dentrok^2+1
de0
.Para una versión que se ejecuta en un tiempo razonable, cambie
k*k+1
aabs k+1
.fuente
Jalea , 11 bytes
Pruébalo en línea!
fuente
JavaScript (ES6),
9493 bytesPruébalo en línea!
fuente
APL (Dyalog Classic) ,
5250 bytesRequiere
⎕IO←0
Pruébalo en línea!
fuente
Retina 0.8.2 ,
104102 bytesPruébalo en línea! Explicación:
Convierta a unario, a menos que la entrada sea cero.
Calcule el índice de Fibonacci del valor absoluto, pero si el número no es un número de Fibonacci, elimínelo, a menos que sea cero. Esto utiliza la expresión regular de prueba de Fibonacci de @ MartinEnder.
Eliminar números negativos cuyos valores absolutos son números impares de Fibonacci.
Agregue índices negativos para números impares positivos de Fibonacci.
Convierte a decimal.
Agregue los índices adicionales para
1
.fuente
En realidad , 34 bytes
La fuerza bruta salva el día
Explicación:
Pruébalo en línea!
fuente
Python 3 , 92 bytes
Pruébalo en línea!
Devuelve un conjunto de índices.
fuente
Python 2 ,
8785 bytesPruébalo en línea!
fuente
05AB1E , 36 bytes
Tiene que haber un mejor enfoque ...>.> Hay seis (o siete si incluimos
0
) diferentes escenarios para este desafío, y me está matando ...Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Algunos ejemplos paso a paso:
fuente
Python 2 ,
959294 bytesPruébalo en línea!
fuente
C # (compilador interactivo de Visual C #) , 144 bytes
Pruébalo en línea!
fuente