Ensamblaje Motorola 68000 - 34 bytes
(Sintaxis del ensamblador 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: Se hizo que el generador de Fibonacci se detuviera en el desbordamiento en lugar de contar, y arregló el 0
caso para que salga en [0]
lugar de hacerlo []
. Sin embargo, pasar un N
accidente negativo ahora.
El comentario en la parte superior es el prototipo C de esta función, utilizando una extensión de lenguaje para identificar qué parámetros van a dónde (de manera predeterminada, van en la pila).
Mi TI-89 , con su procesador de 10MHz, tarda 5 minutos en ejecutar esta función en 1 - 1,000,000.
Aunque el código de la máquina es (actualmente) menos bytes que la solución GolfScript, probablemente sería injusto aceptar esto como la solución más corta porque:
- El código de máquina normalmente no se cuenta como "código fuente". A diferencia del código fuente, el código de máquina generalmente tiene una alta complejidad de símbolos y, lo que es más importante, no se puede imprimir. Consulte " ¿Deben considerarse los binarios ejecutables una solución razonable para code-golf? ".
- Esta solución solo toma un solo número como entrada, en lugar de múltiples entradas.
- Esta solución es una función, no un programa.
Si tiene una TI-89/92 / V200, puede descargar el proyecto completo aquí (desactualizado):
https://rapidshare.com/files/154945328/minfib.zip
Buena suerte persuadiendo a RapidShare para que te dé el archivo real. ¿Alguien sabe de un buen host para archivos tan grandes? 8940 es una gran cantidad de bytes.