Contexte
Une séquence fractale est une séquence entière où vous pouvez supprimer la première occurrence de chaque entier et vous retrouver avec la même séquence qu'auparavant.
Une telle séquence très simple s'appelle les paraphrases de Kimberling . Vous commencez avec les nombres naturels positifs:
1, 2, 3, 4, 5, 6, 7, 8, 9, ...
Ensuite, vous riffle dans quelques blancs:
1, _, 2, _, 3, _, 4, _, 5, _, 6, _, 7, _, 8, _, 9, ...
Et puis vous remplissez à plusieurs reprises les blancs avec la séquence elle-même (y compris les blancs):
1, 1, 2, _, 3, 2, 4, _, 5, 3, 6, _, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, _, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, _, 9, ...
1, 1, 2, 1, 3, 2, 4, 1, 5, 3, 6, 2, 7, 4, 8, 1, 9, ...
C'est notre séquence fractale! Prenons maintenant les sommes partielles:
1, 2, 4, 5, 8, 10, 14, 15, 20, 23, 29, 31, 38, 42, 50, 51, 60, ...
Mais que se passe-t-il si nous répétons ce processus? "Fractalise" la nouvelle séquence (ie les sommes partielles obtenues à partir des étapes ci-dessus):
1, _, 2, _, 4, _, 5, _, 8, _, 10, _, 14, _, 15, _, 20, _, 23, ...
1, 1, 2, _, 4, 2, 5, _, 8, 4, 10, _, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, _, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, _, 20, 8, 23, ...
1, 1, 2, 1, 4, 2, 5, 1, 8, 4, 10, 2, 14, 5, 15, 1, 20, 8, 23, ...
Et reprenons les sommes partielles:
1, 2, 4, 5, 9, 11, 16, 17, 25, 29, 39, 41, 55, 60, 75, 76, 96, ...
Rincez, répétez. Il s'avère que ce processus converge. Chaque fois que vous répétez ce processus, un préfixe plus grand de la séquence reste fixe. Après une quantité infinie d'itérations, vous vous retrouveriez avec OEIS A085765 .
Fait amusant: ce processus convergerait vers la même séquence même si nous ne partions pas des nombres naturels tant que la séquence d'origine commence par 1
. Si la séquence d'origine commence par une autre x
, nous l'obtiendrons à la x*A085765
place.
Le défi
Étant donné un entier positif N
, sortez le N
e élément de la séquence convergée.
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
Vous pouvez choisir si l'indice N
est basé sur 0 ou 1.
Cas de test
La séquence commence par:
1, 2, 4, 5, 9, 11, 16, 17, 26, 30, 41, 43, 59, 64, 81, 82, 108, 117, 147, 151, 192, 203, 246, 248, 307, 323, 387, 392, 473, 490, 572, 573, 681, 707, 824, 833, 980, 1010, 1161, 1165, 1357, 1398, 1601, 1612, 1858, 1901, 2149, 2151, 2458, 2517
Donc, l'entrée 5
devrait se traduire par la sortie 9
.
Voici une implémentation de référence CJam naïve qui génère les premiers N
nombres (donnés N
sur STDIN). Notez que votre code ne doit renvoyer que le N
th élément, pas le préfixe entier.
N
le terme de A085765 , n'est -ce pas?Réponses:
CJam (
2322 octets)Les sommes partielles sont données aux indices pairs de la séquence fractale, qui est A086450 . La récurrence donnée ici comme la définition de A086450 est la base de ces implémentations.
Utiliser une "pile" explicite (entre guillemets effrayants car ce n'est pas LIFO):
Démo en ligne
Dissection
À 23 octets, il existe une approche beaucoup plus efficace, avec mémoisation:
Démo en ligne
la source
f(0) = 1; f(n) = f(n/2) + (n % 2 ? 0 : f(n-2)); return f(2*x)
, mais je ne trouve pas de moyen d'économiser avec cette approche dans CJam.Python 2,
55 4942Je n'ai aucune idée de ce qui se passe, mais il semble difficile de battre la formule Maple de la page OEIS. Cela utilise une indexation basée sur 0.
Merci à @PeterTaylor pour -6 octets.
la source
or
sont effectivementg(n,1) = f(n/2,n%2); g(n,0) = f(n-1) + g(n,1)
; afin que vous puissiez retirer le commung(n,1)
pour obtenirf=lambda n,t=0:n<1or f(n/2,n%2)+0**t*f(n-1)
Haskell, 65
la source
Modèles considérés comme nuisibles , 124
Il s'agit d'une fonction anonyme. C'est plus ou moins la même chose que
mon Python répond àla formule Maple sur la page OEIS, sauf que je n'ai pas implémenté de module, j'ai donc dû utiliser nn / 2 * 2 au lieu de n% 2.Étendu:
la source
Mathematica,
4744 octetsla source
Matlab
108103J'utilise le fait que la série souhaitée est la somme partielle de https://oeis.org/A086450
Mais la complexité de calcul de mon implémentation est loin d'être optimale, même pour cette simple récurrence.
la source