Étant donné une entrée entière positive N , sortez les deux nombres non négatifs, a et b , où a <b , avec la valeur moyenne la plus faible possible, ce qui fera que le nombre N fera partie de la séquence de relations récurrentes:
f(0) = a
f(1) = b
f(n) = f(n-2)+f(n-1)
Dans le cas où il y a plus d'une solution où la moyenne de a et b est minimale, alors vous devriez sortir celle avec le b le plus bas .
Vous pouvez supposer que N est dans la plage représentative des entiers dans votre langue / système.
Cas de test
N = 1
a = 0, b = 1
N = 15
a = 0, b = 3
N = 21
a = 0, b = 1
N = 27
a = 0, b = 9 <- Tricky test case. [3, 7] is not optimal and [4, 3] is not valid
N = 100
a = 4, b = 10
N = 101
a = 1, b = 12
N = 102
a = 0, b = 3
N = 1000
a = 2, b = 10
a>=0
eta<b
y a-t-il déjà plusieurs solutions?1,4
et2,3
donneraient5
, et ils ont la même moyenne. Je suppose qu'il est possible de trouver des cas similaires à celui-ci, où ce sont les valeurs moyennes les plus faibles. Si vous pouvez montrer / prouver qu'il n'y a pas plusieurs solutions, vous n'avez pas besoin de vérifier cette condition.Réponses:
Husk ,
191816141315 octetsMerci Zgarb d'avoir enregistré 1 octet.
Essayez-le en ligne!
Explication:
Avertissement: je ne comprends vraiment pas la
ȯƒẊ++
section du code.Modifier: Il semble se traduire par le Haskell
fix.(mapad2(+).).(++)
, oùmapad2
est la fonction Appliquer à toutes les paires adjacentes dans une liste. (Bien que, connaissant Husk, dans le contexte de ce programme, cela puisse signifier autre chose)la source
JavaScript (Node.js) ,
92 90 89 91 8382 octets-3 octets-1 octet grâce à ThePirateBay-8-9 octets grâce à Neil.Essayez-le en ligne!
Remarque: cette solution repose sur le fait qu'il n'y a jamais plusieurs solutions minimales.
Preuve qu'il n'y a jamais de solutions multiples:
Soit
FIB(a,b,k)
la séquence de Fibonacci commençant para,b
:Lemme 1
La différence entre les séquences de type Fibonacci est elle-même de type Fibonacci, c'est-à-dire
FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. La preuve est laissée au lecteur.Lemme 2
Car
n >= 5
, ila,b
existe une solution satisfaisantea+b < n
:si
n
c'est pair,FIB(0,n/2,3) = n
si
n
c'est étrange,FIB(1,(n-1)/2,3) = n
Preuve
Cas où
n < 5
peuvent être vérifiés de manière exhaustive.Supposons que nous ayons deux solutions minimales pour
n >= 5
,a0,b0
eta1,b1
aveca0 + b0 = a1 + b1
eta0 != a1
.Il existe alors
k0,k1
telFIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.Cas 1:
k0 = k1
WLOG suppose
b0 < b1
(et donca0 > a1
)Soit
DIFF(k)
la différence entre les séquences de type Fibonnaci commençant para1,b1
eta0,b0
:DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(Lemme 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
Une fois qu'une séquence de type Fibonnaci a 2 termes positifs, tous les termes suivants sont positifs.
Ainsi, le seul moment
DIFF(k) = 0
est le momentk = 2
, donc le seul choixk0 = k1
est2
.Par conséquent
n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
La minimalité de ces solutions contredit le lemme 2.
Cas 2
k0 != k1
::WLOG suppose
k0 < k1
.On a
FIB(a1,b1,k1) = n
Laisser
a2 = FIB(a1,b1,k1-k0)
Laisser
b2 = FIB(a1,b1,k1-k0+1)
Ensuite
FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(exercice pour le lecteur)Puisque
FIB(a1,b1,k)
est non négatif pourk >= 0
, il est également non décroissant.Cela nous donne
a2 >= b1 > a0
etb2 >= a1+b1 = a0+b0
.Soit ensuite
DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(Lemme 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
Encore une fois,
DIFF
a 2 termes positifs et donc tous les termes suivants sont positifs.Ainsi, le seul moment où il est possible que
DIFF(k) = 0
estk = 1
, donc le seul choix pourk0
est1
.FIB(a0,b0,1) = n
b0 = n
Cela contredit le lemme 2.
la source
b
au lieu de minimisera+b
, et donc votre solution donnef(27) = [3,7]
mais la solution optimale estf(27)=[0,9]
. Après avoir annulé les changements de rupture, nous sommes tombés à 83 octets.b-~a
au lieu dea+b+1
.a2 >= a1 + b1
n'est pas correct quandk1-k0=1
. Au lieu de cela, vous pouvez utilisera2 >= b1 > a0
etb2 >= a1+b1 = a0+b0
, puis le reste suit.Haskell ,
76 7274 octetsMODIFIER:
/
place dediv
, bien que cela nécessite l'utilisation d'un type de nombre fractionnaire.Enum
plages en ajoutant-1
.f
prend une valeur deDouble
ouRational
tapez et renvoie un tuple de même.Double
devrait suffire pour toutes les valeurs qui ne sont pas assez grandes pour provoquer des erreurs d'arrondi, alors qu'ilRational
est théoriquement illimité.Essayez-le en ligne! (avec les ajustements d'en-tête de H.PWiz aux entrées / sorties
Rational
au format entier)Comment ça marche
?
est un opérateur imbriqué localement dans le cadre def
.a?b
parcourt récursivement la séquence de Fibonacci en commençant para,b
jusqu'à ce queb>=n
, revenantTrue
ssi elle frappen
exactement.s
itère tous les nombres de1
haut en haut, représentant la somme dea
etb
.a
itère à travers les nombres de0
às/2-1
. (Sis
est impair, la fin de la plage est arrondie.)a?(s-a)
teste si la séquence commençant par desa,s-a
hitsn
. Si c'est le cas, la compréhension de la liste comprend le tuple(a,s-a)
. (C'est-à-direb=s-a
, bien qu'il soit trop court pour mériter d'être nommé.)!!0
sélectionne le premier élément (hit) dans la compréhension.la source
APL (Dyalog) ,
7571645953484443 octets2 octets économisés grâce à @ Adám
12 octets économisés grâce à @ngn
Essayez-le en ligne!
Utilise
⎕IO←0
.Comment? C'était devenu vraiment fou.
k←⎕
- attribuer une entrée àk
⍳2⍴1+k←⎕
- Produit cartésien de la gamme0
àk
soi|-\¨
- soustraire chaque élément de la paire droite de la gauche et obtenir des valeurs absoluesa←,⍉
- transposer, aplatir et assigner àa
o←a/⍨</¨a
- ne conserver que les paires dont l'élément gauche est plus petit que l'élément droit, et attribuer ào
o
contient maintenant la liste de toutes les paires aveca < b
, ordonnées par leur moyenne arithématique+\∘⌽⍣{k≤⊃⍺}¨o
- pour chaque paireo
, appliquer des fibonacci (inverser la paire et le sperme) jusqu'à ce que lek
terme ou plus soit atteintk∊¨
- puis décider sik
est ce dernier terme (ce qui signifie qu'il est contenu dans la séquence)o/⍨
- et conservez les paireso
là où s'applique la vérification précédente⊃
- retourner le premier résultat.la source
Python 2 ,
127109107 107 octets-2 octets grâce aux ovs (passage
and
à*
)Essayez-le en ligne!
Des points bonus pour
n,a,s-a
?Explication:
g
, qui vérifie sia, b
développé comme une séquence de Fibonacci atteindrax
. Il vérifie également celaa <= b
, l'un des critères de la question. (Cela permettrait des cas oùa == b
, mais dans un tel cas0, a
aurait déjà été découvert et retourné).a<=b<x
effectue deux tâches pratiques à la fois: vérifiera <= b
, et celab < x
.b < x
rendementsTrue
, la fonction elle - même appelle à nouveau les deux numéros dans la séquence de Fibonacci:b, a+b
. Cela signifie que la fonction continuera d'élaborer de nouveaux termes jusqu'à ce que ...b < x
rendementsFalse
, alors nous avons atteint le point où nous devons vérifier sib==x
. Si c'est le cas, cela reviendraTrue
, ce qui signifie que la paire initialea, b
atteindra finalementx
. Sinon, sib > x
, la paire n'est pas valide.f
, qui trouve la solution pour une valeur donnéen
. Il essaie récursivement de nouvelles paires initiales,,a, b
jusqu'à ce qu'ilg(n, a, b)
donneTrue
. Cette solution est ensuite retournée.s
(initialement 1) eta
(initialement 0). À chaque itération,a
est incrémenté eta, s-a
est utilisé comme première paire. Cependant, lorsqu'il esta
atteints
, il est remis à 0 ets
incrémenté. Cela signifie que les paires sont comptées selon le modèle suivant: Évidemment, cela contient des paires invalides, mais celles-ci sont éliminées instantanément lors de leur passage àg
(voir le premier point).a
ets
sont trouvées telles queg(n, a, s-a) == True
, cette valeur est renvoyée. Comme les solutions possibles sont comptées par ordre de «taille» (triées par moyenne, puis valeur min), la première solution trouvée sera toujours la plus petite, comme le demande le défi.la source
R ,
183 octets160 octetsEssayez-le en ligne!
Merci à Giuseppe d'avoir joué au golf 23 octets
Explication du code
la source
Mathematica, 117 octets
Essayez-le en ligne!
la source
Gelée , 19 octets
Essayez-le en ligne!
-1 octet grâce à la preuve par cardboard_box . Dans le cas contraire, vous pouvez ajouter
UṂṚ
à la fin de la deuxième ligne pour 22 octets au total.la source
Ḣ
x
apparaît en dernier. Six
ont été trouvés au troisième index pour plusieurs, cela fonctionne pour0,x
et fonctionnerait donc également à1,(x-1)/2
(x
impair) ou2,x/2-1
(x
pair), après quoix
apparaîtrait plus tard dans le résultat, de sorte que cela ne se produise pas. Pour une collision ultérieure, la moyenne ne peut être la même que si les troisièmes termes sont également les mêmes, mais alors il faut avoir une différence plus faible entre les termes initiaux (sinon ils seraient les mêmes) et donc ils aurontx
trouvé à un indice ultérieur . En tant que tel, nous pouvonsṫ-Sṭµ¡i³¶ḶŒcÇÐṀ
économiser quatre octets.ṫ-Sṭµ¡i³¶‘ḶŒcÇÐṀ
GolfScript -
8877 octetsJe n'ai pas vérifié plusieurs solutions, grâce à cardboard_box!
Explication
la source
Batch,
160158 bytesla source
3 7
entrée27
. La bonne solution est0 9
.