-3 bytes -1 byte gracias a ThePirateBay
-8 -9 bytes gracias a Neil.
f=(n,a=1,b=0,c=(a,b)=>b<n?c(a+b,a):b>n)=>c(a,b)?b+2<a?f(n,a-1,b+1):f(n,b-~a):[b,a]
Pruébalo en línea!
Nota: esta solución se basa en el hecho de que nunca hay múltiples soluciones mínimas.
Prueba de que nunca hay múltiples soluciones:
Sea FIB(a,b,k)
la secuencia similar a Fibonacci que comienza con a,b
:
FIB(a,b,0) = a
FIB(a,b,1) = b
FIB(a,b,k) = FIB(a,b,k-1) + FIB(a,b,k-2)
Lema 1
La diferencia entre secuencias similares a Fibonacci es en sí misma similar a Fibonacci, es decir FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. La prueba se deja al lector.
Lema 2
Para n >= 5
, a,b
existe una solución satisfactoria a+b < n
:
si n
es parFIB(0,n/2,3) = n
si n
es extrañoFIB(1,(n-1)/2,3) = n
Prueba
Casos donde n < 5
se pueden verificar exhaustivamente.
Supongamos que tenemos dos soluciones mínimas para n >= 5
, a0,b0
y a1,b1
con a0 + b0 = a1 + b1
y a0 != a1
.
Entonces existe k0,k1
tal que FIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.
Caso 1: k0 = k1
WLOG asume b0 < b1
(y por lo tanto a0 > a1
)
Sea DIFF(k)
la diferencia entre las secuencias similares a Fibonnaci que comienzan con a1,b1
y a0,b0
:
DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(Lema 1)
DIFF(0) = a1 - a0 < 0
DIFF(1) = b1 - b0 > 0
DIFF(2) = (a1+b1) - (a0+b0) = 0
DIFF(3) = DIFF(1) + DIFF(2) = DIFF(1) > 0
DIFF(4) = DIFF(2) + DIFF(3) = DIFF(3) > 0
Una vez que una secuencia similar a Fibonnaci tiene 2 términos positivos, todos los términos posteriores son positivos.
Por lo tanto, el único momento DIFF(k) = 0
es cuándo k = 2
, por lo que la única opción para k0 = k1
es 2
.
Por lo tanto n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
La minimidad de estas soluciones contradice el Lema 2.
Caso 2 k0 != k1
:
WLOG asume k0 < k1
.
Tenemos FIB(a1,b1,k1) = n
Dejar a2 = FIB(a1,b1,k1-k0)
Dejar b2 = FIB(a1,b1,k1-k0+1)
Luego FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(ejercicio para el lector)
Como FIB(a1,b1,k)
no es negativo para k >= 0
, tampoco es decreciente.
Esto nos da a2 >= b1 > a0
y b2 >= a1+b1 = a0+b0
.
Entonces deja DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(Lema 1)
DIFF(0) = a2 - a0 > 0
DIFF(1) = b2 - b0 >= (a0 + b0) - b0 = a0 >= 0
DIFF(2) = DIFF(0) + DIFF(1) >= DIFF(0) > 0
DIFF(3) = DIFF(1) + DIFF(2) >= DIFF(2) > 0
Una vez más, DIFF
tiene 2 términos positivos y, por lo tanto, todos los términos posteriores son positivos.
Por lo tanto, el único momento en que es posible DIFF(k) = 0
es k = 1
, por lo que la única opción k0
es 1
.
FIB(a0,b0,1) = n
b0 = n
Esto contradice el Lema 2.
a>=0
, ya<b
hay siempre varias soluciones?