Definamos la secuencia de Fibonacci como
F(1) = 1
F(2) = 2
F(n) = F(n - 2) + F(n - 1)
Entonces tenemos la secuencia infinita 1,2,3,5,8,13,
... Es bien sabido que cualquier entero positivo puede escribirse como la suma de algunos números de Fibonacci. La única advertencia es que esta suma podría no ser única. Siempre hay al menos una forma de escribir un número como una suma de números de Fibonacci, pero puede haber muchos más.
Su desafío es escribir un programa completo que use stdin toma un número entero positivo entre uno y un millón inclusive, y luego genera usando stdout todas las sumas posibles de números de Fibonacci que sumen la entrada. En resumen, los números de Fibonacci no deben repetirse y eso incluye el número 1
. En cualquier suma, si 1
está presente, debe estar presente solo una vez porque en mi definición de la secuencia anterior 1
aparece solo una vez. Las sumas con un solo término son válidas, por lo que si el número de entrada es un número de Fibonacci en sí, entonces el número en sí es una suma válida y debe imprimirse. Si hay varias sumas, entonces entre dos sumas debe haber una línea en blanco para distinguirlas fácilmente.
Aquí hay algunas muestras.
./myfib 1
1
Solo hay una suma de este tipo y solo tiene un término, así que eso es todo lo que se imprime.
./myfib 2
2
Tenga en cuenta aquí que 1+1
no es una suma válida porque se 1
repite.
./myfib 3
1+2
3
Dos sumas y ambas están impresas con una línea en blanco en el medio.
./myfib 10
2+8
2+3+5
./myfib 100
3+8+89
1+2+8+89
3+8+34+55
1+2+3+5+89
1+2+8+34+55
3+8+13+21+55
1+2+3+5+34+55
1+2+8+13+21+55
1+2+3+5+13+21+55
Verdadero código de golf. El código más corto en cualquier idioma gana. Publique su código con algunos casos de prueba (además del que le di anteriormente). En el caso de los empates, elijo el que tiene los votos más altos después de esperar al menos dos semanas y probablemente más. Por lo tanto, la comunidad no dude en votar las soluciones que desee. La inteligencia / belleza del código importa mucho más que quién publica primero.
¡Feliz codificación!
Respuestas:
GolfScript, 54 caracteres
Pruébelo en línea o eche un vistazo a los ejemplos:
fuente
Ruby,
118114(salida de matriz) o138134(salida correcta)Ejecución de muestra:
Cambie
gets
a$*[0]
si desea argumentos de línea de comando (>fibadd 100
), aunque con un carácter +1.Con la salida correcta:
Ejecuciones de muestra:
¡Ese último (12804) solo tomó unos 3 segundos!
fuente
Mathematica,
8985 caracteresAcortado a 85 caracteres gracias a David Carraher.
Mathematica tiene una función incorporada
Fibonacci
, pero no quiero usarla.fuente
i = Input[]; #~Row~"+" & /@ Select[If[# > i, Subsets@{##}, #0[# + #2, ##]] &[2, 1], Tr@# == i &]
i = Input[]; #~Row~"+" & /@ Select[If[# > i, Subsets@{##}, #0[# + #2, ##]] &[2, 1], Tr@# == i &] // Column
Pitón
206181 caracteresEjecución de muestra:
fuente
while i<1000000:v+=[i];i,j=j,i+j
import itertools as z
elimine las nuevas líneas después de los dos puntos, coloquey=input()
lax,y,v
línea y elimine el espacio adicional después de laif
declaración final .Scala, 171
fuente
C #, 376 bytes
Sin golf:
El método
B
devuelve unIEnumerable
que representa el conjunto completo (infinito) de Fibonacci. El segundo método, dado un númeron
, analiza los primerosn
números de Fibonacci (gran exageración aquí), encuentra todos los subconjuntos posibles (el conjunto de potencia) y luego los filtra a subconjuntos cuya suma es exactamenten
, y luego imprime.fuente
APL (75)
Menos competitivo de lo que me gustaría, principalmente debido al formato de salida.
Salida:
Explicación:
I←⎕
: leer entrada, almacenar enI
.⍳2
: comenzando con la lista1 2
,{⍵,+/¯2↑⍵}
: agrega la suma de los dos últimos elementos a la lista,⍣{I<⊃⌽⍺}
: hasta queI
sea más pequeño que el último elemento de la lista.F←
: almacenar enF
(estos son los números de Fibonacci de1
aI
).N←⍴F
: almacena la cantidad de números de Fibonacci enN
.↓⍉(N⍴2)⊤⍳2*N
: obtener los números de1
a2^N
, como bits.S←/∘F¨
: utilice cada uno de estos como una máscara de bits enF
, almacenar enS
.I=+/¨S
: para cada sublista enS
, ver si la suma es igual aI
.S/⍨
: seleccione estos deS
. (Ahora tenemos todas las listas de números de Fibonacci que sumanI
).{
...}¨
: para cada uno de estos:,'+',⍪⍵
: agregue un+
delante de cada número,1↓
: tome la primera+
vuelta,⎕TC[2]
: agregue una nueva línea adicional,⎕←
: y salida.fuente
Haskell - 127
Después de muchas iteraciones terminé con el siguiente código:
Podría haber guardado tal vez un personaje haciendo trampa y agregando un "0+" adicional delante de cada línea de salida.
Quiero compartir otra versión (longitud 143) que se me ocurrió mientras intentaba jugar al golf con la solución anterior. Nunca antes había abusado tanto de operadores y tuplas:
Casos de prueba, 256:
y 1000:
Algunos datos de eficiencia ya que alguien tenía estas cosas:
fuente
05AB1E , 19 bytes (no competidor)
Pruébalo en línea!
Calcula todas las sumas posibles para cualquier dado
n
. Ejemplo de salida para 1000:fuente