Definieren wir die Fibonacci-Sequenz als
F(1) = 1
F(2) = 2
F(n) = F(n - 2) + F(n - 1)
Wir haben also die unendliche Folge 1,2,3,5,8,13,
... Es ist bekannt, dass jede positive ganze Zahl als Summe einiger Fibonacci-Zahlen geschrieben werden kann. Die einzige Einschränkung ist, dass diese Summe möglicherweise nicht eindeutig ist. Es gibt immer mindestens eine Möglichkeit, eine Zahl als Summe von Fibonacci-Zahlen zu schreiben, aber es kann noch viele weitere geben.
Ihre Herausforderung besteht darin, ein vollständiges Programm zu schreiben, das mit stdin eine positive ganze Zahl zwischen einer und einer Million einschließlich aufnimmt und dann mit stdout alle möglichen Summierungen von Fibonacci-Zahlen ausgibt, die sich zur Eingabe summieren. In einer Summe dürfen sich die Fibonacci-Zahlen nicht wiederholen und das schließt die Zahl ein 1
. Wenn eine Summation 1
vorhanden ist, darf sie nur einmal vorhanden sein, da sie in meiner Definition der obigen Sequenz 1
nur einmal vorkommt. Summierungen mit nur Term sind gültig. Wenn die eingegebene Nummer eine Fibonacci-Nummer selbst ist, ist die Nummer selbst eine gültige Summierung und muss gedruckt werden. Wenn mehrere Summen vorhanden sind, muss zwischen zwei beliebigen Summen eine Leerzeile stehen, um leicht zwischen ihnen unterscheiden zu können.
Hier sind einige Beispiele.
./myfib 1
1
Es gibt nur eine solche Summe und sie hat nur einen Begriff, das ist alles, was gedruckt wird.
./myfib 2
2
Beachten Sie hier, dass dies 1+1
keine gültige Summe ist, da sich dies 1
wiederholt.
./myfib 3
1+2
3
Zwei Summen und beide werden mit einer Leerzeile dazwischen gedruckt.
./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
Echter Code-Golf. Der kürzeste Code in einer Sprache gewinnt. Bitte posten Sie Ihren Code mit einigen Testfällen (außer dem oben angegebenen). Bei Krawatten wähle ich die mit den höchsten Stimmen aus, nachdem ich mindestens zwei Wochen und wahrscheinlich länger gewartet habe. Daher kann die Community gerne alle Lösungen bewerten, die Sie mögen. Die Klugheit / Schönheit des Codes ist viel wichtiger als die, die zuerst posten.
Viel Spaß beim Codieren!
Antworten:
GolfScript, 54 Zeichen
Testen Sie es online oder sehen Sie sich die Beispiele an:
quelle
Ruby,
118114 (Array-Ausgabe) oder138134 (korrekte Ausgabe)Probelauf:
Wechseln Sie
gets
zu,$*[0]
wenn Sie Befehlszeilenargumente (>fibadd 100
) möchten , jedoch +1 Zeichen.Mit der richtigen Ausgabe:
Probeläufe:
Der letzte (12804) dauerte nur etwa 3 Sekunden!
quelle
Mathematica,
8985 ZeichenDank David Carraher auf 85 Zeichen verkürzt.
Mathematica hat eine eingebaute Funktion
Fibonacci
, aber ich möchte sie nicht verwenden.quelle
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 ZeichenProbelauf:
quelle
while i<1000000:v+=[i];i,j=j,i+j
import itertools as z
Entfernen Sie die Zeilenumbrüche nach den Doppelpunkten, setzen Siey=input()
diex,y,v
Zeile ein und entfernen Sie den zusätzlichen Platz nach der endgültigenif
Anweisung.Scala, 171
quelle
C #, 376 Bytes
Ungolfed:
Die Methode
B
gibt eine zurückIEnumerable
, die die gesamte (unendliche) Fibonacci-Menge darstellt. Die zweite Methode, bei der eine Zahl angegeben istn
, betrachtet die erstenn
Fibonacci-Zahlen (hier ein großer Overkill), findet alle möglichen Teilmengen (die Potenzmenge) und filtert dann zu Teilmengen, deren Summe genau istn
, und druckt dann.quelle
APL (75)
Weniger wettbewerbsfähig als ich möchte, hauptsächlich wegen des Ausgabeformats.
Ausgabe:
Erläuterung:
I←⎕
: Eingabe lesen, speichern inI
.⍳2
: beginnend mit der Liste1 2
,{⍵,+/¯2↑⍵}
: Addiere die Summe der letzten beiden Elemente zur Liste,⍣{I<⊃⌽⍺}
: bisI
ist kleiner als das letzte Element der Liste.F←
: speichern inF
(dies sind die Fibonacci-Zahlen von1
bisI
).N←⍴F
: Speichern Sie die Anzahl der Fibonacci-Zahlen inN
.↓⍉(N⍴2)⊤⍳2*N
: Holen Sie sich die Zahlen von1
bis2^N
als Bits.S←/∘F¨
: Verwenden Sie diese als Bitmaske aufF
, speichern Sie inS
.I=+/¨S
: Überprüfen Sie für jede Unterliste inS
, ob die Summe gleich istI
.S/⍨
: Wählen Sie diese ausS
. (Jetzt haben wir alle Listen von Fibonacci-Zahlen, die sich summierenI
.){
...}¨
: für jede dieser:,'+',⍪⍵
: füge+
vor jeder Zahl ein hinzu,1↓
: nimm den ersten+
zurück,⎕TC[2]
: einen zusätzlichen Zeilenumbruch hinzufügen,⎕←
: und Ausgabe.quelle
Haskell - 127
Nach vielen Iterationen kam ich zu folgendem Code:
Ich hätte vielleicht ein Zeichen speichern können, indem ich betrogen und vor jeder Ausgabezeile eine zusätzliche "0+" hinzugefügt hätte.
Ich möchte eine andere Version (Länge 143) teilen, die ich mir ausgedacht habe, als ich versucht habe, die vorherige Lösung zu spielen. Ich habe Operatoren und Tupel noch nie so oft missbraucht:
Testfälle, 256:
und 1000:
Einige Effizienzdaten, seit jemand dieses Zeug hatte:
quelle
05AB1E , 19 Bytes (nicht konkurrierend)
Probieren Sie es online aus!
Berechnet alle möglichen Summen für eine bestimmte
n
. Beispielausgabe für 1000:quelle