Reto
Debe escribir un programa que tome un entero positivo n
como entrada y genere el n
número th Fibonacci (acortado como Fib # en todo) que contiene el n
th Fib # como subcadena. Para los propósitos de este desafío, la secuencia de Fibonacci comienza con a 1
.
Aquí hay algunos ejemplos que puede usar como casos de prueba, o como ejemplos para aclarar el desafío (para este último, deje un comentario a continuación explicando lo que no está claro).
n=1
Fib#s: 1
^1 1st Fib# that contains a 1 (1st Fib#)
Output: 1
n=2
Fib#s: 1, 1
^1 ^2 2nd Fib# that contains a 1 (2nd Fib#)
Output: 1
n=3
Fib#s: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233
^1 ^2 ^3 3rd Fib# that contains a 2 (3rd Fib#)
Output: 233
n=4
Output: 233
n=5
Output: 6765
n=6
Output: 28657
n=7
Output: 1304969544928657
n=8
Output: 14472334024676221
n=9
Output: 23416728348467685
n=10
Fib#s: 1, ..., 34, 55, 89, ..., 63245986, 102334155, 165580141, ..., 2880067194370816120, 4660046610375530309
^1 ^2 ^3 ^10 10th Fib# that contains a 55 (10th Fib#)
Output: 4660046610375530309
Como siempre, este es el código de golf , así que busque el menor recuento de bytes posible.
Si algo es confuso / poco claro, deje un comentario.
(Este desafío se basa en otro desafío que publiqué: imprima la enésima prima que contiene n )
n=5
prueba, porque acabo de cometer un error tonto donde escribí un cheque que contó un número varias veces si tenía la subcadena más de una vez.n=5
atraparía eso por el55
.n=25
(la salida tiene 1186 dígitos), luego se mata porn=26
(3085 dígitos compilados en mi propia computadora portátil). Parece haber un salto en la dificultad cada vez quefib(n)
obtiene un dígito más (como cabría esperar). El siguiente salto, 31, tiene 12990 dígitos en la salida final.Respuestas:
Haskell ,
8584 bytesEDITAR:
l
.x>=s
forx<=s
) en explicación.f
toma unInt
y devuelve unString
.Pruébalo en línea!
Cómo funciona
l
es la lista infinita de números de Fibonacci, definida recursivamente como las sumas parciales de0:1:l
. Comienza con0
porque las listas están indexadas en 0.m
es la misma lista convertida en cadenas.f
:n
es el número de entrada yx
es la (cadena del)n
número de Fibonacci.y
es un número de Fibonacci probado para ver si contienex
una subcadena. Losy
s que pasan se recopilan en la lista y se indexan con el final!!n
para dar el resultado. Sex
antepone un extra a las pruebas para guardar dos bytes sobre el uso!!(n-1)
al final.y
varias veces,y
se envuelven las pruebas de cada unaor
y otra lista de comprensión.s
itera a través de los sufijos dey
.x
es un prefijo des
, verificamos six<=s
yx++":">s
. (":"
es algo arbitrario pero debe ser más grande que cualquier número).fuente
l=0:scanl(+)1l
Guarda un byte.Jalea ,
1514 bytes1 byte gracias a Jonathan Allan.
Pruébalo en línea!
fuente
Python 2 ,
9986 bytesb=i=x=-1 a=1
y soltando elx and
f and n==2
enf*(n>2)
a,b=a+b,a
taquigrafía de intercambio económicof-=str(x)in str(a)
, exprimido(n<2)*f
Pruébalo en línea!
Explicación:
Python 3 ,
12612011311211010199 bytesPruébalo en línea!
fuente
b=i=x=-1
a=1
y soltando elx and
. (Esencialmente comenzando 3 pasos antes en la secuencia de Fibonacci de dos lados -1, 1, 0, 1, 1, 2, ....)-1
: Pn==2
realmente necesita un tratamiento especial. Pero se puede acortar a*(n>2)
.Java,
118111bytesSigo pensando que debería ser posible no duplicar el bit de Fibonacci, pero todos mis esfuerzos de alguna manera resultan en más bytes.
Gracias a Kevin por las mejoras ... supongo que muestra que este fue mi primer intento de jugar al golf :)
fuente
i->{long n=i,p=0,q,c=1;while(--n>0){q=p;p=c;c+=q;}n=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}return p;}
(118 bytes)while(--n>0){q=p;p=c;c+=q;}
puede serfor(;--n>0;p=c,c+=q)q=p;
yn=c;while(i>0){if((""+c).contains(""+n))--i;q=p;p=c;c+=q;}
puede serfor(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;
. (En total:i->{long n=i,p=0,q,c=1;for(;--n>0;p=c,c+=q)q=p;for(n=c;i>0;q=p,p=c,c+=q)if((""+c).contains(""+n))--i;return p;}
( 111 bytes )Perl 6 , 45 bytes
$_
es el argumento de la función;@f
es la secuencia de Fibonacci, generada perezosamente.fuente
JavaScript (ES6),
9693929086 bytes0 indexado, con el número 0 en la secuencia
1
. Mierda a las14
.26 bytes guardados gracias a ArnauldIntentalo
Explicación
Versión actualizada a seguir, cuando tenga un minuto.
fuente
Carbón , 65 bytes
Pruébalo en línea! Enlace al código detallado para explicación.
fuente
PHP , 96 bytes
Pruébalo en línea!
fuente
Mathematica, 85 bytes
entrada
-4 bytes de @JungHwan Min
salida
fuente
f@i@n++
es totalmente válido, disminuyendo 1 byte. Usar enFor
lugar deWhile
reduce 3 bytes. 85 bytes:(i=ToString;f=Fibonacci;For[n=t=0,t<#,If[i@f@n++~StringContainsQ~i@f@#,t++]];f[n-1])&
R,
7772 bytesEsto hace uso de la
gmp
biblioteca para el número de Fibonacci. Implementación bastante directa de la pregunta.Algunas pruebas
fuente
Clojure, 99 bytes
Una solución básica, utiliza una secuencia infinita de números de Fibonacci
s
.fuente
C #, 35 bytes
Intentalo
fuente
n
y simplemente pone la salida enb
(creo). Podrías escribir esa toman
como argumentos y devolucionesb
... Además, estoy bastante seguro de que no estás calculando lo que los desafíos te piden. En realidad, no tengo idea de lo que estás computando. ¿Podría utilizar algún código que podamos ejecutar para verificar su solución? (su "Pruébelo" no se puede ejecutar como está ..)NewStack , 14 bytes
La caida:
En inglés: (con ejemplo de una entrada de 3)
N∞
: Haz una lista de los números naturales[1,2,3,4,5,6...]
ḟᵢ
: Almacenar la entrada en la variablef
[1,2,3,4,5,6...]
fi
: Convierta la lista a números de Fibonacci[1,1,2,3,5,8...]
'fif
: Mantenga todos los elementos que contengan elf
número de Fibonacci[2,21,233...]
Ṗf⁻
: Imprime elf-1
elemento th (-1 debido a la indexación basada en 0)233
fuente
Japt ,
1615 bytesIntentalo
fuente