Aujourd'hui, nous allons regarder une séquence a , liée à la fonction Collatz f :
Nous appelons une séquence de la forme z, f (z), f (f (z)),… une séquence de Collatz .
Le premier nombre de notre séquence, a (1) , est 0 . Sous l'application répétée de f , il tombe dans un cycle 0 → 0 →…
Le plus petit nombre que nous n'avons pas encore vu est 1, ce qui fait un (2) = 1 . Sous l'application répétée de f , il tombe dans un cycle 1 → 4 → 2 → 1 →…
Maintenant, nous avons vu le nombre 2 dans le cycle ci-dessus, donc le plus petit nombre suivant est a (3) = 3 , tombant dans le cycle 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 → 4 → 2 → 1 →…
Dans tous les cycles ci-dessus, nous avons déjà vu 4 et 5 , donc le nombre suivant est a (4) = 6 .
Vous devriez maintenant avoir l'idée. a (n) est le plus petit nombre qui ne faisait partie d'aucune séquence de Collatz pour tous a (1),…, a (n - 1) .
Écrivez un programme ou une fonction qui, étant donné un entier positif n , renvoie a (n) . Le code le plus court en octets gagne.
Testcases:
1 -> 0
2 -> 1
3 -> 3
4 -> 6
5 -> 7
6 -> 9
7 -> 12
8 -> 15
9 -> 18
10 -> 19
50 -> 114
(Il s'agit de la séquence OEIS A061641 .)
n
peut-elle être basée sur 0?a(n+1) = a(n) odd: 3*a(n)+1, or a(n) even: a(n)/2
a
n'est pas basé sur 0, je ne comprends pas pourquoi vous semblez "parler sur la base de 0" ici:a(n) is the smallest number that was not part of any Collatz sequences for all a(0), …, a(n − 1).
Réponses:
Gelée ,
2019 octetsEssayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
Après n itérations, la valeur de a (n + 1) sera au début du tableau. Puisque nous concaténons le nouveau tableau avec une copie inversée de l'ancien, cela signifie qu'un (n) sera à la fin.
la source
Haskell,
9392 octetsExemple d'utilisation:
([y|y<-[-1..],all(/=y)$c=<<[0..y-1]]!!) 10
->19
.c x
est le cycle Collatz pourx
avec un peu de triche pourx == 1
. Les principales fonctions boucle dans tous les entiers et maintient ceux qui ne sont pasc x
pourx
en[0..y-1]
. À peu près une mise en œuvre directe de la définition. Comme l'opérateur d'index Haskell!!
est basé sur 0, je commence par-1
ajouter un nombre (sinon inutile) pour obtenir l'index fixe.la source
MATL ,
4640 octetsEssayez-le en ligne!
Explication
Le code a une
for
boucle externe qui génère desn
séquences Collatz, une à chaque itération. Chaque séquence est générée par unedo...while
boucle interne qui calcule de nouvelles valeurs et les stocke dans un vecteur de séquence jusqu'à ce que a1
ou0
soit obtenu. Une fois la séquence terminée, le vecteur est inversé et concaténé en un vecteur global qui contient les valeurs de toutes les séquences précédentes. Ce vecteur peut contenir des valeurs répétées. L'inversion du vecteur de séquence garantit qu'à la fin de la boucle externe le résultat souhaité (la valeur de départ de la dernière séquence) sera à la fin du vecteur global.Pseudo-code :
Code commenté :
la source
Brachylog ,
7067656362 octetsEssayez-le en ligne!
la source
Python 2,
9796 octetsProfite du fait que tous les multiples de 3 sont purs. Testez-le sur Ideone .
Comment ça marche
Sur la première ligne,
r,=s={-1}
définit s = {-1} (set) et r = -1 .Ensuite, nous lisons un entier de STDIN, répétons une certaine chaîne plusieurs fois, puis l'exécutons. Ceci est équivalent au code Python suivant.
Dans chaque itération, nous commençons par trouver le plus petit membre de {r + 1, r + 2, r + 3} qui n'appartient pas à s . Dans la première itération, cela initialise r à 0 .
Dans toutes les exécutions suivantes, s peut (et contiendra) une partie de r + 1 , r + 2 et r + 3 , mais jamais tous, car tous les multiples de 3 sont purs. Pour vérifier cette affirmation, notez qu'aucun multiple m de 3 n'est de la forme 3k + 1 . Cela laisse 2m comme seule pré-image possible, qui est également un multiple de 3 . Ainsi, m ne peut apparaître dans la séquence de Collatz d'aucun nombre inférieur à m , et est donc pur.
Après avoir identifié r et initialisé n , nous appliquons la fonction Collatz avec
n=(n/2,3*n+1)[n%2]
, en ajoutant chaque valeur intermédiaire de n à l'ensemble s avecs|={n}
. Une fois que nous rencontrons un nombre n qui est déjà dans s ,{n}-s
cela donnera un ensemble vide et l'itération s'arrêtera.La dernière valeur de r est l'élément souhaité de la séquence.
la source
Pyth , 32 octets
Suite de tests.
la source
Java, 148 octets
Ideone it! (Attention: complexité exponentielle due à une optimisation nulle.)
La convertir d'une
do...while
boucle enfor
boucle serait plus golfique, mais j'ai du mal à le faire.Les conseils de golf sont les bienvenus comme d'habitude.
la source
for(b=1,i=1;i<n;i++)
àfor(b=1,i=0;++i<n;)
. Btw, je comprends pourquoi votre idéone manque le cas de test pour 50, mais pourquoi manque-t-il également le 10? Il peut le gérer sans problème.int a(int n){if(n<2)return 0;int f=a(n-1),b=0,i,c;for(;b<1;){f++;for(b=1,i=1;i<n;i++)for(c=i==2?4:a(i);c>1;c=c%2>0?c*3+1:c/2)b=c==f?0:b;}return f;}
Perl6, 96
Basé sur la réponse Perl 5 . Un peu plus longtemps car la syntaxe Perl6 est moins indulgente que la syntaxe Perl5, mais je vais me contenter de cela pour l'instant.
la source
PHP,
233124 octets+4 pour la fonction:
la source
Perl 5-74 octets
Il s'agit d'une solution assez simple. Il applique à plusieurs reprises la fonction Collatz à la variable
$a
et stocke dans le tableau@c
que la valeur a été vue, puis après avoir atteint 0 ou 1, il incrémente$a
jusqu'à ce que ce soit un nombre qui n'a pas encore été vu. Ceci est répété un nombre de fois égal à l'entrée moins 2, et enfin la valeur de$a
est sortie.la source
Mathematica, 134 octets
Format plus facile à lire:
la source