Reto
Debe generar un programa o función que tome un número entero positivo N, calcule los primeros N términos de la secuencia de Fibonacci en binario, lo concatene en un solo número binario, convierta ese número de nuevo en decimal y luego muestre el decimal como un entero.
Por ejemplo
1 -> [0] -> 0 to decimal outputs 0
3 -> [0, 1, 1] -> 011 to decimal outputs 3
4 -> [0, 1, 1, 10] -> 01110 to decimal outputs 14
No es necesario que muestre el ->
, solo el número (por ejemplo, si el usuario escribe 4
, solo muestra 14
). Las flechas son solo para ayudar a explicar lo que debe hacer el programa.
Casos de prueba
1 -> 0
2 -> 1
3 -> 3
4 -> 14
5 -> 59
6 -> 477
7 -> 7640
8 -> 122253
9 -> 3912117
10 -> 250375522
11 -> 16024033463
12 -> 2051076283353
13 -> 525075528538512
14 -> 134419335305859305
15 -> 68822699676599964537
16 -> 70474444468838363686498
17 -> 72165831136090484414974939
18 -> 147795622166713312081868676669
19 -> 605370868394857726287334099638808
20 -> 4959198153890674493745840944241119317
El programa debe poder generar hasta el límite del idioma en uso. No se permiten tablas de búsqueda ni soluciones alternativas comunes .
Este es el código de golf , por lo que gana la respuesta con el menor número de bytes.
int32_t binary_concat_Fib(int n)
, lo que limitaría el valor de salida resultante a 2 ^ 31-1. es decir, puede suponer que todos los bits concatenados encajan en un número entero. ¿O debería funcionar la función hasta el punto en que el número de Fibonacci más grande no cabe en un entero por sí solo, por lo que concatenar los bits requiere una mayor precisión?Respuestas:
Python , 64 bytes
Pruébalo en línea!
fuente
Gelatina ,
76 bytesPruébalo en línea!
¿Cómo?
fuente
Ṛc’SƲƤ
que podría ser útil para secuencias similares.Python 3.6 , 61 bytes
Pruébalo en línea!
fuente
brainfuck , 397 bytes
¡Bueno eso fue divertido!
Toma entrada ASCII (p
11
. Ej. ), Las salidas dan como resultado ASCII.Nota: para probar esto en línea, asegúrese de establecer el tamaño de celda en 32 bits (en el lado derecho de la página web). Si no ingresa una entrada, su navegador podría fallar.
El intérprete no puede manejar la entrada de
11
y superior porque solo admite hasta 32 bits.Pruébalo en copy.sh
Explicación
Obtenga entrada decimal y agregue uno (para mitigar off-by-one)
Genera números de fibonacci en la cinta.
Configurar para el bucle de concatenación binario entrante
Entonces las celdas contienen el valor, comenzando desde la primera posición,
Mira estas celdas:
Voy a etiquetar esto:
pow
está ahí para encontrar la potencia máxima de 2 que es estrictamente mayor quenum
.sum
es la concatenación de números hasta ahora.cat
es el poder de 2 que necesitaría multiplicarnum
para poder concatenarnum
delante delsum
(por lo que podría simplemente agregar).Bucle: compruebe si
f_n
es estrictamente menor quepow
.Verdad:
Cero basura. Luego, agregue
num
*cat
asum
. Luego, cargue el siguiente número de Fibonacci (=f_(n-1)
; si no existe, salga del bucle) y configúrelocat
encat
*pow
. Prepárese para el próximo ciclo (cero más basura, cambie el alcance en uno).Falsey
Establecer
pow
en 2 *pow
, restaurarnum
.Repita hasta que no quede ningún número de Fibonacci.
Basura limpia Tome cada dígito del número resultante y genere cada uno (en ascii).
fuente
Casco , 7 bytes
Pruébalo en línea!
Explicación
fuente
Japt , 9 bytes
Ejecutarlo
Explicación:
fuente
Pyth, 22 bytes
Pruébalo aquí
Explicación
fuente
Perl 6 , 38 bytes
Pruébalo en línea!
fuente
JavaScript (Node.js) ,
7065585755 bytesPruébalo en línea!
fuente
-0
al final para guardar otros 2 bytes.05AB1E , 6 bytes
Pruébalo en línea!
1 indexado.
fuente
J, 36 bytes
Explicación:
fuente
x86,
372221 bytesRegistro de cambios
bsr
. Gracias Peter Cordes!-2 al poner a cero los registros con
mul
.-1 mediante el uso de un bucle while en lugar de
loop
ypush
/pop
ecx
(crédito Peter Cordes).Entrada
edi
, salida enedx
.Objdump:
fuente
lea
para cambiar y agregar en fib2. Además, extraer cada bit uno a la vez es innecesario. Usebsr %eax, %ecx
para encontrar el número de bits en la representación binaria, y use un cambio por CL / o para fusionar, como lo está haciendo la respuesta Python de Dennis.cl
turnos, así que tome su contador de bucle en un registro diferente (como%edi
) y usedec %edi / jnz
(3 bytes en código de 32 bits, 4 bytes en 64 bits). En el código de 32 bits, eso ahorra un total de 1 byte al soltar el ecx push / pop. No caiga en la trampa de usarloop
cuando hace que el problema sea más difícil, no más fácil. (Su convención de llamadas ya es personalizada,%ebx
no se puede llamar a su funciónmain
). Es posible que pueda regresar a EAX sin dejar de aprovechar 1 bytexchg
, no es necesario que no sea estándar si no lo necesita.inc %ecx
del conteo de turnos con un desplazamiento a la izquierda adicional a medida que agrega, usandolea (%eax, %edx, 2), %edx
. Neutro en bytes para 32 bits, guarda uno para x86-64. Pero guarda una instrucción.loop
código golf, me siento sucio. Bueno, no del todo, pero decepcionado porque no pude encontrar una implementación igualmente pequeña que evitara esa instrucción lenta; fuera del código de golf,loop
es una de mis manías . Me gustaría que era rápido en las CPU modernas, ya que sería muy agradable para los bucles de precisión extendida sin puestos de bandera parcial, pero no lo es y debe ser considerada sólo como una instrucción optimización del tamaño oscuro que hace que su código lento.xor
/mul
truco a cero tres registros (¿alguna vez necesita tantos ceros?), Pero usar eso como parte de la creación de un1
hace que sea más sensible.APL (Dyalog) ,
2622 bytes4 bytes guardados gracias a @ H.PWiz
Pruébalo en línea!
fuente
Haskell ,
897675 bytesVersión sin golf:
fuente
f=0:scanl(+)1f
(tomada de aquí ). Las funciones pueden ser anónimas, por lo que puede quitar el liderazgog=
, consulte nuestra Guía de reglas de Ggolfing en Haskell .$realToFrac y
con.read.show$y
un bytePari / GP , 59 bytes
Pruébalo en línea!
fuente
APL + WIN, 55 bytes
Solicita la entrada de pantalla de entero.
La precisión entera máxima de APL + WIN es 17 y el límite entero es del orden de 10E300, por lo tanto, el número máximo de entrada es 55 y el resultado es: 1.2492739026634838E300
fuente
Python 3 , 94 bytes
Pruébalo en línea!
fuente
Jalea , 6 bytes
Pruébalo en línea!
Ḷ
gama owered -> n ºÆḞ
número ibonacci -> de DEC paraB
ciertas piezas ->F
latten -> deḄ
ciertas piezas a diciembrefuente
10
y obtendrá un16024033463
, es incorrecto (la respuesta correcta es250375522
).10
regresa250375522
MATL , 21 bytes
Pruébalo en línea!
Explicación
fuente
J , 25 bytes
Pruébalo en línea!
Explicación
fuente
Python 3 , 86 bytes
Pruébalo en línea!
fuente
Agregar ++ , 113 bytes
Pruébalo en línea!
fuente
PHP, 124 bytes
Pruébalo en línea!
Así que estaba buscando una manera de generar números de Fibonacci usando la serie, hasta que encontré esto . Resulta que puedes calcular la serie de Fibonacci a través del redondeo, así que probé el desafío con una función recursiva.
El enfoque de "redondeo" me pareció realmente interesante, también un profesor me lo mostró hace un tiempo.
Código
Explicación
También revise esta publicación de stackoverflow, la mejor respuesta se refiere al mismo artículo en Wikipedia.
fuente
Stax , 9 bytes
¡Ejecútelo y depúrelo en staxlang.xyz!
Desempaquetado (10 bytes) y explicación:
fuente
Julia 0.6 , 65 bytes
Pruébalo en línea!
fuente
Pyth, 27 bytes
Banco de pruebas
Traducción de Python 3:37 bytesBanco de pruebas
Traducción de Python 3:fuente
Ruby , 61 bytes
Pruébalo en línea!
fuente
Jotlin , 59 bytes
Programa de prueba
Admite hasta 10, cambiando
.i(2)
para.toLong(2)
admitiría hasta 14 si es necesariofuente
Python 2, 88 bytes
fuente
R ,
244180179 bytesPruébalo en línea!
Guardado algunos bytes concatenando vectores numéricos, no cadenas. ¡Caso especial sangriento para 0!
fuente
sapply
'd a un vector debido al hecho de que es recursiva. No puede estar todo envuelto en una sola línea. Como puede ver, el programa solicita la entrada del usuario y luego devuelve la respuesta. Se puede guardar un byte creando un acceso directo paraifelse
. Y ... podemos quitar,""
descan
sí.