Probablemente esté familiarizado con la secuencia de Fibonacci donde los dos primeros términos son 0, 1
(o a veces 1, 1
) y cada término posterior es la suma de los dos anteriores. Comienza así:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
A veces, la secuencia contiene números que tienen un patrón particular que me parece interesante: la diferencia entre cualquier par de dígitos adyacentes es la misma que cualquier otro par. Por ejemplo, en la secuencia que comienza con 0, 1
, el decimoctavo término es 987
. 9-8=1
y 8-7=1
. Estoy ligeramente satisfecho
Desafío
Dados dos valores iniciales F(0)
y F(1)
, genera cada número en la secuencia generada F(n) = F(n-1) + F(n-2)
que cumple los siguientes criterios:
- La diferencia entre cualquier par de dígitos adyacentes es la misma que cualquier otro par
- Tiene al menos tres dígitos (los números de 1 y 2 dígitos no son interesantes para este patrón)
Entrada
- Dos enteros no negativos menores de 10 ** 10 (10 mil millones)
Salida
- Todos los enteros que son menores de 10 ** 10 y cumplen los criterios de la sección Desafío
- Es aceptable generar dígitos superiores a 10 ** 10, pero no es un requisito
- Dado que los dígitos repetidos cumplen con el patrón (p
777
. Ej. ), Es posible que haya números infinitos que cumplan con los criterios, pero no se requiere que su programa salga para siempre - Si no existen tales enteros, envíe lo que desee siempre que no sea un número (nada, nulo, matriz vacía, mensaje de error, cara triste, etc.)
- Si un número que coincide con el patrón aparece más de una vez en la secuencia, puede generarlo una o tantas veces como ocurra
- Si alguna entrada cumple con los criterios, debe incluirse en la salida
Reglas
- La entrada y la salida pueden estar en cualquier formato estándar
- Las lagunas estándar están prohibidas
- Este es el código de golf, por lo que gana el código más corto en bytes
Ejemplos / Casos de prueba
Input , Output
[1,10] , []
[0,1] , [987]
[2,1] , [123]
[2,3] , [987]
[61,86] , [147]
[75,90] , [420]
[34,74] , [1234]
[59,81] , [2468]
[84,85] , [7531]
[19,46] , [111]
[60,81] , [222]
[41,42] , [333]
[13,81] , [444]
[31,50] , [555]
[15,42] , [666]
[94,99] , [777]
[72,66] , [888]
[3189,826] , [888888888]
[15,3] , [159,258]
[22,51] , [321,1357]
[74,85] , [159,4444]
[27,31] , [147,11111]
[123,0] , [123,123,123,246,369]
[111,0] , [111,111,111,222,333,555,888]
[111,222] , [111,222,333,555,888]
[33345,692] , [987654321]
[3894621507,5981921703] , [9876543210]
[765432099,111111111] , [111111111,876543210,987654321]
[1976,123] , [123, 2222, 4321, 6543, 45678]
[1976, 123] -> [123, 2222, 4321, 6543, 45678]
,[3189, 826] -> [888888888]
,[33345, 692] -> [987654321]
Respuestas:
MATL , 14 bytes
Gracias a Emigna por señalar un error, ahora corregido
Bucle infinito que genera los números a medida que se encuentran.
Pruébalo en línea! Tenga en cuenta que en el intérprete en línea los resultados se muestran después del tiempo de espera de 1 minuto.
Explicación
Deje
F(n)
yF(n+1)
denote dos términos genéricos consecutivos de la secuencia de Fibonacci. Cada iteración del ciclo comienza con la pila que contieneF(n)
,F(n+1)
para algunosn
.fuente
05AB1E ,
171615 bytesPruébalo en línea!
Explicación
fuente
JavaScript (ES6),
858481 bytesPruébalo en línea!
Prueba de dígitos adyacentes
Tanto x como d se inicializan a una función anónima, que las fuerzas
NaN
de todas las operaciones aritméticas que están involucrados. La primera iteraciónsome()
da siempre(d = [function] - n) === NaN
y(r = [function] - d) === NaN
(Falsy). En la segunda iteración, tenemosd = x - n
(un número entero) y(r = NaN - d) === NaN
(falso nuevamente). A partir de la tercera iteración, r se establece en un número entero que no es cero si la diferencia entre el dígito # 3 y el dígito # 2 no es igual a la diferencia entre el dígito # 2 y el dígito # 1.El número p cumple los criterios requeridos si y solo si
some()
es falso (todos los dígitos adyacentes tienen la misma diferencia) y el valor final de r es 0 (hubo al menos 3 iteraciones). Esto da!false / 0 === true / 0 === Infinity
(verdad).De lo contrario, podemos tener:
!true / r
con r> 0 o r <0 , lo que dafalse / r === 0
(falso)!false / NaN
, que datrue / NaN === NaN
(falsedad)Condición de detención
La recursión se detiene cuando se
p | q
evalúa a 0 . Se garantiza que esto sucederá cuando p y q alcancen valores alrededor de 10 25 que tienen una longitud de 84 bits. Como JS tiene 52 bits de mantisa, los últimos 32 bits se ponen a cero. Entonces, el OR bit a bit de 32 bits se evalúa a 0 .Debido a la rápida tasa de crecimiento de la secuencia, esto sucede bastante rápido.
fuente
Java 8,
151144140136130 bytesBucle infinito que genera los números cuando los encuentra.
Pruébelo en línea (agota el tiempo de espera después de 60 segundos).
Versión de 136 bytes con límite 10 10 agregado (
a<1e10
):Pruébalo en línea.
Explicación:
fuente
Jalea ,
20 1918 bytesPruébalo en línea!
+ƝḢ;Ɗȷ¡
produce los primeros mil (ȷ
) términos en la serie que siempre serán suficientes. Creo que probablemente hay una forma más corta de hacer esto.+ȷ¡
se acerca pero solo funciona si el primer término es cero.Supongo que podemos tomar los dos números a la inversa, lo que permite un byte
DIE
.Si no estamos obligados a generar ninguna de las entradas:
Jalea , 15 bytes
Pruébalo en línea!
fuente
DIEƊ
durante el proceso de golf.Octava ,
919083 bytes¡Guardado 7 bytes gracias a Luis Mendo!
Pruébalo en línea!
¡Pues funciona!
eval
con for loop dentro para guardar algunos bytes. Omitir dos puntos y puntos y coma para ahorrar unos pocos. Utiliza el hecho de que un vector se considera verdadero si todos los elementos son distintos de cero para guardarany
oall
.Aparte de eso, es más o menos una implementación sencilla de Fibonacci.
fuente
Python 2 ,
10298 bytesPruébalo en línea!
Thx para 4 bytes desde ovs
fuente
Haskell , 105 bytes
Define el operador
(%)
que devuelve una lista infinita con todas las soluciones. Para ver realmente el resultado en stdout , necesitamos deshabilitar el almacenamiento en búfer (o ejecutarlo enghci
o conrunhaskell
), ¡ pruébelo en línea!Explicación / Ungolfed
La función
f
es solo una función auxiliar que espera una función binaria y una lista, aplica la funcióng
a todos los pares adyacentes. Es esencialmente lo mismo que:El operador
(%)
es solo una comprensión de la lista que filtra un poco (asegurándose de que haya al menos 3 dígitos y que los dígitos adyacentes tengan la misma distancia):fuente
CJam , 55 bytes
Pruébalo en línea!
Mi primera presentación de CJam, no muy corta pero muy divertida. Cualquier sugerencia es bienvenida!
fuente
Stax ,
2624 bytesEjecutar y depurarlo
Explicación
No es tan corto como me gustaría y probablemente pueda jugar al golf un poco más, pero funciona.
fuente
Ruby , 79 bytes
Pruébalo en línea!
fuente
Julia 0.6 ,
8681 bytesPruébalo en línea!
Bastante sencillo: verifique si la entrada tiene al menos 3 dígitos (
n>99
), luego tome la diferencia entre cada par de dígitos en el número (diff(digits(n))
), verifique que la longitud de (endof
) un conjunto único de (∪
) esas diferencias sea 1 (es decir, todas las diferencias son los mismos), y si es así, imprima el número. Haga eso para los dos números dados, luego llame recursivamente a la función con los siguientes dos números.(Desafortunadamente, parece queAhora sobrecarga al±
tiene mayor prioridad que+
, o de lo contrario la llamada final podría haber sidoa+b±a+2b
, guardar 3 bytes.)<
operador, ahorrando tanto en los bytes del operador como en los corchetes de precedencia. (Sin<
embargo, no se puede usar en nuestro código, así que solo se reorganizóendof(...)<2
para2>endof(...)
).Si se permite una salida extraña, podemos guardar 2 bytes usando en
@show
lugar deprintln
, imprimiendo enn = 987
lugar de solo987
. Incluso podríamos usardump
1 byte más bajo que eso, perodump
imprime la información del tipo junto con el valor, por lo que la salida será enInt64 987
lugar de solo987
.fuente