OEIS a une variation (A111439) sur la séquence de Golomb . Comme dans la séquence de Golomb, A(n)
décrit la fréquence d' n
apparition dans la séquence. Mais en plus, aucun numéro consécutif ne peut être identique. Lors de la création de la séquence, A(n)
est toujours choisi comme le plus petit entier positif qui ne viole pas ces deux propriétés. En raison de numéros identiques consécutifs interdits, la série oscille légèrement de haut en bas à mesure qu'elle grandit. Voici les 100 premiers termes:
1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 8, 9,
10, 9, 10, 9, 10, 11, 10, 11, 10, 11, 10, 11, 12, 11, 12, 13, 12, 13, 12,
13, 12, 13, 12, 13, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 16, 15,
16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 18, 17, 18, 17, 18, 19, 18, 19, 18,
19, 18, 19, 18, 19, 18, 19, 20, 19, 20, 21, 20, 21, 20, 21, 20, 21, 20
La liste complète des 10 000 premiers numéros peut être consultée sur OEIS .
Le défi est d'écrire un programme ou une fonction qui calcule A(n)
, donné n
. n
est 1
basé pour garantir que la propriété auto-descriptive fonctionne.
Règles
Vous pouvez écrire un programme ou une fonction et utiliser l'une de nos méthodes standard de réception d'entrée et de sortie.
Vous pouvez utiliser n'importe quel langage de programmation , mais notez que ces failles sont interdites par défaut.
Il s'agit de code-golf , donc la réponse valide la plus courte - mesurée en octets - l'emporte.
Cas de test
n A(n)
1 1
4 2
10 6
26 10
100 20
1000 86
1257 100
10000 358
N
apparition après la dernière occurrenceN-1
qui mesure le nombre d'oscillations jusqu'àN
.)Réponses:
Haskell , 67 octets
Définit une fonction
f
. Essayez-le en ligne! C'est très lent, lef 15
temps de calcul expire sur TIO.Explication
Juste pour la définition: à chaque étape, choisissez le nombre positif minimal
n
qui satisfait les contraintes (différent de l'entrée précédente, et qui ne s'est pasf n
encore produit).la source
Mathematica,
6968 octetsMerci à Martin Ender d'avoir trouvé un octet supplémentaire de 1 pour moi!
Fonction sans nom prenant un entier positif
n
en entrée et retournant un entier positif. Nous construisons la liste complète des premiersn
éléments de cette séquence, puis prenons l'Last
élément. La liste est construite en commençant par la liste vide{}
et en fonctionnant avec une fonctionn
fois de suite (viaNest
).La fonction en question est
{##&@@#,1//.x_/;x==Last@#||#~Count~x==#[[x]]->x+1}&
, qui prend une liste partielle de valeurs de séquence (essentiellement##&@@#
) et y ajoute la valeur suivante. La valeur suivante est calculée en commençant parx=1
, puis en la remplaçantx
dex+1
manière répétée aussi longtemps que la conditionx==Last@#||#~Count~x==#[[x]]
est remplie, en d'autres termes, si l'un ou l'autrex
est l'élément précédent, ou s'ilx
figure déjà dans la liste le nombre correct de fois. Cette fonction crache quelques erreurs, car (par exemple) nous ne devrions pas appeler lex
e élément de la liste initiale{}
; cependant, les valeurs sont toutes correctes.la source
Python 2,
9986 octetsMerci à @Dennis pour plusieurs améliorations totalisant 13 octets!
Le programme se déroule assez naïvement: il garde la liste des valeurs déterminées jusqu'à présent et cherche à ajouter la valeur suivante. Il essaie d'ajouter un
1
à la fin de la liste s'il le peut; sinon, il essaie a2
et ainsi de suite jusqu'à ce que quelque chose soit autorisé.Maintenant, nous commençons par ensemencer les résultats pour
1,2,3
être1,2,3
. Ceci est fait pour éviter tout problème avec la liste des valeurs déjà calculées étant trop courte: je suppose que sin
est au moins4
alorsa(n)
est strictement inférieur àn
. (Dans ce programme,s[n]
est égal àa(n)
. Notre liste est en fait initialisée pour être[0,1,2,3]
parce que les listes sont0
-indexées en Python. Ainsi, par exemplea(1)=s[1]=1
, eta(2)=s[2]=2
.)Alors, disons que nous essayons de déterminer
s[m]
, ce qui signifie que notre liste comprend déjàs[0], s[1], ..., s[m-1]
. Nous allons commencert=1
et essayer de réglers[m]=1
. Lorsque cela ne fonctionne pas, nous allonst=2
et essayons de réglers[m]=2
. Chaque fois que nous augmentonst
, nous vérifions sis.count(t)==s[t]
... mais le côté droit ne produira pas d'erreur tant que nous n'aurons jamais à aller aussi haut quet=m
. La conjecture dit que nous n'avons jamais à le faire, car la première valeur que nous calculons est en faits[4]
.Cette implémentation calcule 3 valeurs de séquence de plus que nécessaire. Par exemple, si
n
est8
, il calculera jusqu'às[11]
ce qu'il renvoie la valeur des[8]
.Je serais heureux de voir une preuve de la conjecture. Je crois que cela peut être prouvé par une induction (forte?).
Edit: Voici une preuve de la conjecture . Nous prouvons en fait une forme légèrement plus forte de la déclaration, car elle n'implique aucun travail supplémentaire.
Théorème: Pour tout
n
supérieur ou égal à4
, le termea(n)
est inférieur ou égal à(n-2)
.Preuve (par Strong Induction): (Base
n=4
): L'énoncé est vrai pourn=4
, depuisa(4) = 2 = 4-2
.Supposons maintenant que
a(k)
est inférieur ou égal àk-2
pour tousk
de4
travers àn
inclusif (et supposonsn
est au moins4
). En particulier, cela signifie que tous les termes précédents de la séquence étaient au maximum(n-2)
. Nous devons montrer que cea(n+1)
sera tout au plus(n-1)
. Maintenant, par définition,a(n)
est le plus petit entier positif qui ne viole aucune des conditions, nous devons donc simplement montrer que la valeur(n-1)
ne violera aucune des conditions.La valeur
(n-1)
ne violera pas la condition "pas de répétitions consécutives", car par l'hypothèse d'induction l'entrée précédente était au plus(n-2)
. Et cela ne violera pas la condition "a(m)
est le nombre de foism
apparaît", à moins d'(n-1)
avoir déjà été atteinta(n-1)
fois. Mais par l'hypothèse d'induction forte,(n-1)
avait déjà été atteint0
fois, eta(n-1)
n'est pas égal à0
car ila(m)
est positif pour tousm
.a(n+1)
Est donc inférieur ou égal àn-1 = (n+1)-2
, comme souhaité. QED.la source
Gelée , 17 octets
Les trois derniers cas de test sont trop pour TIO. J'ai vérifié 1000 et 1257 localement.
Essayez-le en ligne! ou vérifiez les 100 premiers termes .
Comment ça marche
la source
Python 2 ,
7774 octetsIl s'agit d'une implémentation récursive de l'algorithme de @ mathmandan .
L'implémentation est O (fou) : l'entrée 9 prend localement 2 secondes, l'entrée 10 52 secondes et l'entrée 11 17 minutes et 28 secondes. Cependant, si elle est déclarée comme une fonction régulière plutôt que comme lambda, la mémorisation peut être utilisée pour vérifier les cas de test.
Essayez-le en ligne!
Notez que même avec la mémorisation, TIO ne peut pas calculer f (1257) ou f (10000) (tous deux vérifiés localement).
la source
05AB1E ,
3231 octetsEssayez-le en ligne!
Explication
Nous sommes techniquement en boucle
G
lorsque nous ajoutons N à la liste globale, mais toutes les boucles de 05AB1E utilisent la même variable N comme index, donc la boucle interne[...]
a écrasé le N deG
sens, nous pouvons l'ajouter en dehors de la boucle.Les problèmes avec les boucles imbriquées et les conditions nous empêchent de le faire à l'intérieur de la boucle.
la source
Befunge,
141136 octetsEssayez-le en ligne!
En raison des limites de mémoire de Befunge, il n'est pas vraiment pratique de garder une trace de toutes les entrées d'entrées précédentes dans la séquence, donc cette solution utilise un algorithme avec une empreinte mémoire inférieure qui calcule les valeurs plus directement.
Cela dit, nous sommes toujours limités par la taille de la cellule, qui dans l'interpréteur de référence Befunge-93 est une valeur signée de 8 bits, de sorte que le nombre pair le plus élevé pris en charge dans la séquence est
A(1876) = 126
, et le nombre impair le plus élevé pris en charge estA(1915) = 127
.Si vous souhaitez tester des valeurs plus grandes, vous devrez utiliser un interpréteur avec une taille de cellule plus grande. Cela devrait inclure la plupart des implémentations de Befunge-98 ( essayez-le en ligne! ).
la source
Python 2, 117 octets
Meh. Pas si court. La solution itérative simple.
Essayez-le en ligne
Voici une très mauvaise tentative de solution récursive (129 octets):
la source
-1
au lieu d'n-1
enregistrer un octet, je suppose que non.