Assemblaggio Motorola 68000 - 34 byte
(Sintassi dell'assemblatore GNU)
| 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: il generatore di Fibonacci si è arrestato in caso di overflow piuttosto che contando, e risolto il 0
caso in modo che emetta [0]
piuttosto che []
. Tuttavia, passare un N
arresto negativo ora.
Il commento in alto è il prototipo C di questa funzione, usando un'estensione del linguaggio per identificare quali parametri vanno dove (per impostazione predefinita, vanno in pila).
La mia TI-89 , con il suo processore da 10 MHz, impiega 5 minuti per eseguire questa funzione su 1 - 1.000.000.
Sebbene il codice macchina sia (attualmente) meno byte rispetto alla soluzione GolfScript, probabilmente sarebbe ingiusto accettarlo come soluzione più breve perché:
- Il codice macchina normalmente non viene conteggiato come "codice sorgente". A differenza del codice sorgente, il codice macchina di solito presenta un'elevata complessità del simbolo e, cosa più importante, non è stampabile. Vedi "I binari eseguibili devono essere considerati una soluzione ragionevole per il code-golf? ".
- Questa soluzione accetta solo un singolo numero come input, anziché più input.
- Questa soluzione è una funzione, non un programma.
Se hai una TI-89/92 / V200, puoi scaricare il progetto completo qui (non aggiornato):
https://rapidshare.com/files/154945328/minfib.zip
Buona fortuna a convincere RapidShare a darti il file attuale. Qualcuno sa di un buon host per file così grandi? 8940 è un sacco di byte.