Définissons la séquence de Fibonacci comme
F(1) = 1
F(2) = 2
F(n) = F(n - 2) + F(n - 1)
Nous avons donc la séquence infinie 1,2,3,5,8,13,
... Il est bien connu que tout entier positif peut être écrit comme une somme de quelques nombres de Fibonacci. La seule mise en garde est que cette sommation n'est peut-être pas unique. Il existe toujours au moins une façon d'écrire un nombre sous la forme d'une somme de nombres de Fibonacci, mais il peut y en avoir beaucoup plus.
Votre défi est d'écrire un programme complet qui, à l'aide de stdin, prend un entier positif compris entre un et un million inclus, puis génère à l'aide de stdout toutes les sommations possibles des nombres de Fibonacci qui résument à l'entrée. En résumé, les nombres de Fibonacci ne doivent pas se répéter et cela inclut le nombre 1
. Dans toute sommation, s'il 1
est présent, il ne doit être présent qu'une seule fois car dans ma définition de la séquence ci-dessus 1
n'apparaît qu'une seule fois. Les sommations avec un seul terme sont valides donc si le numéro d'entrée est un nombre de Fibonacci lui-même, alors le nombre lui-même est une sommation valide et doit être imprimé. Si plusieurs sommes, alors entre deux sommes, il doit y avoir une ligne vierge pour les distinguer facilement.
Voici quelques exemples.
./myfib 1
1
Il n'y a qu'une seule telle somme et elle n'a qu'un terme, c'est tout ce qui est imprimé.
./myfib 2
2
Notez ici que ce 1+1
n'est pas une somme valide car elle se 1
répète.
./myfib 3
1+2
3
Deux sommes et elles sont toutes les deux imprimées avec une ligne vierge entre les deux.
./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
Véritable golf de code. Le code le plus court dans n'importe quelle langue gagne. Veuillez poster votre code avec quelques cas de test (en plus de celui que j'ai donné ci-dessus). En cas d'égalité, je choisis celui qui a le plus de votes positifs après avoir attendu au moins deux semaines et probablement plus. Alors, la communauté, n'hésitez pas à voter pour toutes les solutions que vous aimez. L'intelligence / la beauté du code importe beaucoup plus que celui qui publie en premier.
Bon codage!
Réponses:
GolfScript, 54 caractères
Testez-le en ligne ou regardez les exemples:
la source
Ruby,
118114 (sortie de réseau) ou138134 (sortie correcte)Exemple d'exécution:
Changer
gets
de$*[0]
si vous voulez que des arguments de ligne de commande (>fibadd 100
), le caractère +1 cependant.Avec la sortie correcte:
Exemples de cycles:
Ce dernier (12804) n'a pris que 3 secondes environ!
la source
Mathematica,
8985 caractèresRaccourci à 85 caractères grâce à David Carraher.
Mathematica a une fonction intégrée
Fibonacci
, mais je ne veux pas l'utiliser.la source
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
Python
206181 caractèresExemple d'exécution:
la source
while i<1000000:v+=[i];i,j=j,i+j
import itertools as z
:, supprimez les retours à la ligne après les deux-points, mettez-lesy=input()
avec lax,y,v
ligne et supprimez l'espace supplémentaire après laif
déclaration finale .Scala, 171
la source
C #, 376 octets
Non golfé:
La méthode
B
renvoie unIEnumerable
qui représente l'ensemble (infini) de Fibonacci. La deuxième méthode, étant donnée un nombren
, examine les premiersn
nombres de Fibonacci (énorme surpuissance ici), trouve tous les sous-ensembles possibles (l'ensemble de puissance), puis filtre les sous-ensembles dont la somme est exactementn
, puis imprime.la source
APL (75)
Moins compétitif que je ne le souhaiterais, principalement en raison du format de sortie.
Production:
Explication:
I←⎕
: lire l'entrée, stockerI
.⍳2
: en commençant par la liste1 2
,{⍵,+/¯2↑⍵}
: ajouter la somme des deux derniers éléments à la liste,⍣{I<⊃⌽⍺}
: jusqu'àI
est plus petit que le dernier élément de la liste.F←
: stocker dansF
(ce sont les nombres de fibonacci de1
àI
).N←⍴F
: stocke le nombre de fibonacci dansN
.↓⍉(N⍴2)⊤⍳2*N
: obtenir les nombres de1
à2^N
, sous forme de bits.S←/∘F¨
: utilisez chacun d'eux comme masque de bitsF
, stockez-leS
.I=+/¨S
: pour chaque sous-liste dansS
, voir si la somme est égale àI
.S/⍨
: sélectionnez-les parmiS
. (Nous avons maintenant toutes les listes de nombres de fibonacci qui se résument àI
.){
...}¨
: pour chacun d'entre eux:,'+',⍪⍵
: ajoutez un+
devant chaque numéro,1↓
: retirer le premier+
,⎕TC[2]
: ajoutez une nouvelle ligne supplémentaire,⎕←
: et sortie.la source
Haskell - 127
Après de nombreuses itérations, je me suis retrouvé avec le code suivant:
J'aurais pu sauver peut-être un caractère en trichant et en ajoutant un "0+" supplémentaire devant chaque ligne de sortie.
Je veux partager une autre version (longueur 143) que j'ai trouvée en essayant de jouer au golf avec la solution précédente. Je n'ai jamais autant abusé d'opérateurs et de tuples:
Cas de test, 256:
et 1000:
Quelques données d'efficacité puisque quelqu'un avait ce genre de choses:
la source
05AB1E , 19 octets (non concurrent)
Essayez-le en ligne!
Calcule toutes les sommes possibles pour une donnée
n
. Exemple de sortie pour 1000:la source