Le théorème de Zeckendorf montre que chaque entier positif peut être représenté de manière unique comme une somme de nombres de Fibonacci non adjacents. Dans ce défi, vous devez calculer la somme de deux nombres dans la représentation de Zeckendorf.
Soit F n le n -ième nombre de Fibonacci où
F 1 = 1,
F 2 = 2 et
pour tout k > 2, F k = F k - 1 + F k - 2 .
La représentation Zeckendorf Z ( n ) d'un entier non négatif n est un ensemble d'entiers positifs tels que
n = Σ i ∈ Z ( n ) F i et
∀ i ∈ Z ( n ) i + 1 ∉ Z ( n ).
(en prosa: la représentation de Zeckendorf d'un nombre n est un ensemble d'entiers positifs tels que les nombres de Fibonacci pour ces indices se résument à n et pas deux entiers adjacents font partie de cet ensemble)
Notamment, la représentation de Zeckendorf est unique. Voici quelques exemples de représentations de Zeckendorf:
Z (0) = ∅ (l'ensemble vide)
Z (1) = {1}
Z (2) = {2}
Z (3) = {3} ({1, 2} n'est pas la représentation de Zeckendorf de 3)
Z (10) = {5, 2}
Z (100) = {3, 5, 10}
Dans ce défi, les représentations Zeckendorf sont codées sous forme d' ensembles de bits où le bit le moins significatif représente si 1
fait partie de l'ensemble, etc. Vous pouvez supposer que les représentations Zeckendorf de l'entrée et de la sortie tiennent sur 31 bits.
Votre tâche consiste à calculer Z ( n + m ) étant donné Z ( n ) et Z ( m ). La solution avec la longueur d'octets la plus courte l'emporte.
Vous pouvez trouver une implémentation de référence écrite en ANSI C ici . Il peut également être utilisé pour générer des représentations Zeckendorf ou calculer un nombre à partir de sa représentation Zeckendorf.
Voici quelques paires d'échantillons d'entrée et de sortie, où les deux premières colonnes contiennent l'entrée et la troisième colonne contient la sortie:
73865 9077257 9478805
139808 287648018 287965250
34 279004309 279004425
139940 68437025 69241105
272794768 1051152 273846948
16405 78284865 83888256
9576577 4718601 19013770
269128740 591914 270574722
8410276 2768969 11184785
16384 340 16724
Réponses:
K (ngn / k) ,
45 43 4241 octetsEssayez-le en ligne!
@ Algorithme de Bubbler
{
}
fonction avec argumentx
64(
)/0
faire 64 fois, en utilisant 0 comme valeur initiale:1,
ajouter 1+':
ajouter chaque préalable (laisser le premier élément intact)F:
attribuer àF
pour "séquence fibonacci"|
inverser(
..){y!x}\
.. en commençant par la valeur de gauche, calculez les restes cumulés (de gauche à droite) pour la liste de droite. la valeur de gauche est la somme simple des entrées sans représentation zeckendorf:2\x
coder en binaire les entrées. ce sera une matrice nbits par 2|
inverser+/'
somme chacun&
où sont les 1? - liste des indices. s'il y a des 2, l'index correspondant est répété deux fois.F@
indexation de tableau dansF
+/
somme<':
moins que chaque précédent (le premier du résultat sera toujours falsey)2/
décodage binairela source
CJam,
7674706359 octetsEssayez-le en ligne dans l' interpréteur CJam ou vérifiez tous les cas de test à la fois .
Idée
Nous commençons par définir une variation mineure de la séquence dans la question:
De cette façon, le bit 0 (LSB) de l'entrée ou de la sortie des tableaux de bits correspond au nombre de Fibonacci G 0 et, en général, du bit k à G k .
Maintenant, nous remplaçons chaque bit défini dans Z (n) et Z (m) par l'index qu'il code.
Par exemple, l'entrée 532 10 = 1000010100 2 est transformée en [2 4 9] .
Cela donne deux tableaux d'entiers, que nous pouvons concaténer pour en former un seul.
Par exemple, si n = m = 100 , le résultat est A: = [2 4 9 2 4 9] .
Si nous remplaçons chaque k dans A par G k et ajoutons les résultats, nous obtenons n + m = 200 , donc A est un moyen de décomposer 200 en nombres de Fibonacci, mais certainement pas celui du théorème de Zeckendorf.
En gardant à l'esprit que G k + G k + 1 = G k + 2 et G k + G k = G k + G k-1 + G k-2 = G k + 1 + G k-2 , nous pouvons substituer consécutifs et les index dupliqués par d'autres (à savoir, (k, k + 1) par k + 2 et (k, k) par (k + 1, k - 2) ), répétant ces substitutions encore et encore jusqu'à ce que la représentation de Zeckendorf soit atteinte. 1
Un cas particulier doit être pris pour les indices négatifs résultants. Puisque G -2 = 0 , l'indice -2 peut simplement être ignoré. De plus, G -1 = 0 = G 0 , donc tout -1 résultant doit être remplacé par 0 .
Pour notre exemple A , nous obtenons les représentations suivantes (triées), la dernière étant la représentation de Zeckendorf.
[2 2 4 4 9 9] → [0 3 4 4 9 9] → [0 5 4 9 9] → [0 6 9 9] → [0 6 7 10] → [0 8 10]
Enfin, nous convertissons le tableau de nombres entiers en tableau de bits.
Code
1 L'implémentation tente de remplacer 32 fois et ne vérifie pas si la représentation de Zeckendorf a bien été atteinte. Je n'ai pas de preuve formelle que cela soit suffisant, mais j'ai testé toutes les sommes possibles de représentations 15 bits (dont les représentations de sommes nécessitent jusqu'à 17 bits) et 6 répétitions suffisaient pour toutes. Dans tous les cas, augmenter le nombre de répétitions à 99 est possible sans augmenter le nombre d'octets, mais cela réduirait les performances.
la source
APL (Dyalog Extended) , 39 octets
Essayez-le en ligne!
Changé en un programme complet prenant un argument de longueur 2, et a également changé le générateur de Fibonacci. Merci à @ngn pour beaucoup d'idées.
Utilise
⎕IO←0
pour que⍳2
s'évalue0 1
.Générateur Fibonacci (nouveau)
Notez que les deux derniers chiffres sont inexacts, mais cela ne change pas la sortie du programme.
Zeckendorf à plaine (partiel)
APL (Dyalog Extended) , 47 octets
Essayez-le en ligne!
Modification de la partie 1 de la réponse précédente pour réutiliser les numéros de Fibonacci. Supprimez également le doublon 1 pour enregistrer des octets à d'autres endroits.
Partie 1 (nouvelle)
APL (Dyalog Extended) , 52 octets
Essayez-le en ligne!
Comment ça fonctionne
Aucun algorithme sophistiqué pour effectuer un ajout dans Zeckendorf car APL n'est pas connu pour fonctionner sur des éléments individuels dans un tableau. Au lieu de cela, j'ai continué à convertir les deux entrées de Zeckendorf en entiers simples, à les ajouter et à les reconvertir.
Partie 1: Zeckendorf en entier simple
Partie 2: ajouter deux entiers simples
Partie 3: Convertir la somme en Zeckendorf
"Vous pouvez supposer que les représentations Zeckendorf de l'entrée et de la sortie correspondent à 31 bits" était assez pratique.
Le générateur de Fibonacci
Cela découle de la propriété des nombres de Fibonacci: si Fibonacci est défini comme
puis
Chiffres de Fibonacci à Zeckendorf
la source
Haskell, 325
396octetsEDIT: nouvelle version:
z
Fait le travail.la source
=
c'est, donc les parents n'y sont pas nécessaires , et ainsi de suite et ainsi de suite, et notez que les:
associés à droite et vous pouvez en couper là-bas. Mais bon, bravo! Semble très compliqué. J'ai hâte de comprendre comment cela fonctionne!ES6, 130 octets
À l'origine, j'ai essayé de calculer la somme en place (dans la ligne de l'implémentation de CJam), mais je continuais à manquer de temporels, donc je viens de convertir les nombres en et à partir d'entiers réels.
(Oui, je peux probablement enregistrer un octet en utilisant eval.)
la source
Rubis ,
85 7365 octetsEssayez-le en ligne!
Comment?
Obtenez d'abord une limite supérieure pour la somme codée: (a + b) * 2 est ok.
Maintenant, filtrez tous les numéros non zeckendorf de (0..limit).
Nous avons une table de recherche, c'est en descente d'ici.
la source
Python 3, 207 octets
Essayez-le en ligne! (Vérifiez tous les cas de test)
Explication
Ce programme manipule directement les traductions binaires des représentations de Zeckendorf. La fonction
a(n,m)
effectue les calculs principaux ets(n)
est une fonction d'aide qui supprime les nombres adjacents contenus dans la représentation de Zeckendorf.Commençons par la fonction
s(n)
(développée pour plus de clarté):Par exemple, le nombre 107 (
1101011
en binaire, représentant 1 + 2 + 5 + 13 + 21 = 42), subit le processus suivant:Essayez-le en ligne! (s avec sortie détaillée)
Voici une version étendue de
a(n,m)
:Cette fonction convertit les deux représentations de Zeckendorf en quatre nombres binaires plus faciles à combiner. La ligne (A) est le OU binaire des deux représentations binaires de Zeckendorf - celles-ci correspondent à une copie de chaque nombre de Fibonacci dans l'un ou l'autre groupe. (B) et (C) sont les ET binaires des deux nombres décalés à droite 1 et 2 fois, respectivement. Nous savons que lorsque les nombres de Fibonacci correspondants pour (B) et (C) sont additionnés, ils seront équivalents au ET binaire de notre
n
etm
parce que F (n) = F (n-1) + F (n-2) .Par exemple, disons que nous avons les nombres binaires n = 101001 (correspondant à 1 + 5 + 13) et m = 110110 (2 + 3 + 8 + 13). Ensuite, nous aurons (A) = 111111 (1 + 2 + 3 + 5 + 8 + 13), qui est converti en 1010100 (3 + 8 + 21) par notre fonction
s
, (B) = 10000 (8), et ( C) = 1000 (5). Nous pouvons vérifier que (1 + 5 + 13) + (2 + 3 + 8 + 13) = (3 + 8 + 21) + (8) + (5) = 45. Ce processus se répète avec ((3 + 8 + 21) + (8)) + (5) = ((3 + 8 + 21) + (5) + (3)) + (5), etc.La seule difficulté avec ce système est qu'il ne fonctionne pas pour les numéros de Fibonacci 1 et 2, car ils n'obéissent pas à la propriété
F(n)=F(n-1)+F(n-2)
(ce sont les deux nombres les plus bas)! De ce fait, à chaque fois 1 ou 2 est contenu à la foisn
etm
, ils sont retirés de A, B et C, alors leur somme placée dans D sous la propriété que 1 + 1 = 2 et 2 + 2 = 1 + 3. Par exemple, si nous ajoutons 1 + 3 (101) + 1 + 3 + 5 (1101), nous obtenons:(A): 3 + 5 (1100) = 8 (10000)
(B): 2 (10)
(C): 1 (1)
(D): 2 (10)
Notez que les 3 et 5 ont été placés dans A, le 3 en double a été divisé en 2 + 1 en B et C, et les 1 en double ont été supprimés de A, B et C, ajoutés ensemble et mis en D.De même, si nous ajouter 2 + 3 (110) + 2 + 3 + 5 (1110), on obtient:
(A): 3 + 5 (1100) = 8 (10000)
(B): 2 (10)
(C): 1 (1)
(D): 1 + 3 (101)
Essayez-le en ligne! (a avec sortie détaillée)
la source
Wolfram Language (Mathematica) , 218 octets
Essayez-le en ligne!
Simplement l'appariement des motifs.
Non golfé:
la source