Motorola 68000-Assembly - 34 Byte
(GNU-Assembler-Syntax)
| short min_fib_partition(long N asm("%d2"), long *out asm("%a0"))
min_fib_partition:
| Generate Fibonacci numbers on the stack (-1, 1, 0, 1, 1, 2, 3, ..., 1134903170).
moveq #-1, %d0 | A = -1
moveq #1, %d1 | B = 1
generate_loop:
move.l %d0, -(%sp) | Push A to the stack.
exg.l %d0, %d1 | A' = B
add.l %d0, %d1 | B' = A + B
bvc.s generate_loop | Stop when signed long overflows.
| Go back up the stack, partitioning N using the greedy algorithm.
moveq #0, %d0 | Initialize return value (number of terms).
subtract_loop:
move.l (%sp)+, %d1 | Pop a Fibonacci number F off the stack.
cmp.l %d1, %d2 | If N < F, continue to smaller Fibonacci number.
blt.s subtract_loop
addq.w #1, %d0 | Increment the term count.
move.l %d1, (%a0)+ | Append F to the output array.
sub.l %d1, %d2 | N -= F
bne.s subtract_loop | Continue if N has not yet reached zero.
| Clear the stack by searching for that -1.
clear_stack_loop:
tst.l (%sp)+
bge clear_stack_loop
done:
rts
36 → 34: Der Fibonacci-Generator wurde nicht durch Zählen, sondern durch Überlauf gestoppt und das 0
Gehäuse so repariert, dass es [0]
stattdessen ausgibt []
. Allerdings N
stürzt das Übergeben eines Negativs jetzt ab.
Der Kommentar oben ist der C-Prototyp dieser Funktion und verwendet eine Spracherweiterung , um zu identifizieren, welche Parameter wohin gehen (standardmäßig werden sie auf dem Stapel abgelegt).
Mein TI-89 mit seinem 10-MHz-Prozessor benötigt 5 Minuten, um diese Funktion auf 1 - 1.000.000 auszuführen.
Obwohl der Maschinencode (derzeit) weniger Bytes enthält als die GolfScript-Lösung, wäre es wahrscheinlich unfair, dies als kürzeste Lösung zu akzeptieren, weil:
- Maschinencode wird normalerweise nicht als "Quellcode" gezählt. Im Gegensatz zum Quellcode weist der Maschinencode normalerweise eine hohe Symbolkomplexität auf und ist, was noch wichtiger ist, nicht druckbar. Siehe " Sollten ausführbare Binärdateien als sinnvolle Lösung für Code-Golf angesehen werden? ".
- Diese Lösung verwendet nur eine einzige Zahl als Eingabe und nicht mehrere Eingaben.
- Diese Lösung ist eine Funktion, kein Programm.
Wenn Sie einen TI-89/92 / V200 haben, können Sie das vollständige Projekt hier herunterladen (veraltet):
https://rapidshare.com/files/154945328/minfib.zip
Viel Glück beim Überreden von RapidShare, Ihnen die eigentliche Datei zu geben. Kennt jemand einen guten Host für so große Dateien? 8940 ist eine Menge Bytes.