Les séquences
On vous donne quatre séquences de nombres, numérotées 1
par 4
.
OEIS L'emplacement de
0
's lorsque les nombres naturels sont répertoriés en binaire. Voici un exemple de calcul de la séquence:0,1,10,11,100,101,110,111 ^ ^ ^^ ^ ^ 0 3 78 10 14
Le début de la séquence se déroule comme suit:
0, 3, 7, 8, 10, 14, 19, 20, 21, 23, 24, 27, 29, 31, 36, 37, 40, 45, 51, ...
OEIS Cette séquence comprend le premier nombre naturel, saute les deux suivants, puis inclut les trois suivants, puis saute les quatre suivants et continue.
0, 3, 4, 5, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 26, 27, 36, ...
OEIS Entiers positifs où à la fois le nombre de
0
et le nombre de1
dans la représentation binaire du nombre sont des puissances de2
.2, 4, 5, 6, 9, 10, 12, 16, 23, 27, 29, 30, 33, 34, 36, 39,
OEIS Le Hofstadter Q séquence .
a (1) = a (2) = 1;
a (n) = a (na (n-1)) + a (na (n-2)) pour n> 2.1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 6, 8, 8, 8, 10, 9, 10, 11, 11, 12, 12, 12, 12, 16, 14, ...
On sait peu de choses sur cette séquence, mais de nombreux résultats empiriques existent. L'une est particulièrement importante et vous pouvez supposer qu'elle est valable pour toute la série:
Cet article a observé que les éléments de la série peuvent être regroupés en générations. Si nous les numérotons à partir de 1, alors la k ème génération contient exactement 2 k éléments. La propriété pertinente est que tous les nombres de la génération k sont obtenus en additionnant deux nombres des générations k-1 et / ou k-2 , mais jamais des générations précédentes. Vous pouvez utiliser cette (et seulement cette) observation pour mettre une limite inférieure sur les éléments restants de la séquence.
Défi
Votre défi est d'imprimer les premiers x
nombres à l'intersection des séquences d'entrée données.
Entrée: deux nombres séparés par un espace STDIN
. Le premier nombre est un entier de 1
à 15
inclusif où chaque bit correspond à une séquence. Le bit le plus bas correspond à la séquence 1
et le bit le plus élevé correspond à la séquence 4
. La seconde est la quantité de nombres x
, à afficher STDIN
.
Sortie: Les premiers x
nombres qui coupent les séquences d'entrée données. Imprimez les nombres STDOUT
avec n'importe quel espace clair ou ponctuation comme délimiteur (espaces, tabulations, sauts de ligne, virgules, deux-points, points, etc.).
Exemples
1. Imprimez les premiers 3
nombres de chaque séquence.
Contribution: 15 3
Production: 10,23,40
2. Imprimez les premiers 12
chiffres du numéro de séquence 1
et 4
.
Contribution: 9 12
Production: 3,8,10,14,19,20,21,23,24,31,37,40
3. Imprimez les premiers 10
nombres dans l'ordre2
.
Contribution: 2 10
Production: 0,3,4,5,10,11,12,13,14,21
4. Imprimez les premiers 6
nombres dans les séquences 3
et 4
.
Contribution: 12 6
Production: 2,4,5,6,9,10
Détails
- Vous pouvez imprimer la sortie au fur et à mesure ou à la fois à la fin.
Un grand merci à tous ceux qui ont aidé avec cela dans le chat! Cette question a grandement profité du fait d'être dans le bac à sable .
la source
12 5
exemple jusqu'au même index,10
cela vient en effet avant9
dans l'intersection ... comme, comment, en parcourant les séquences, décideriez-vous de sauter l'9
in # 3 comme intersection possible? Comme si # 3 avait7
dedans, alors vous seriez obligé de le sauter car cela n'apparaît pas dans # 4x
?Réponses:
Haskell,
495442402Il fonctionne assez bien. Voici quelques exemples d'OP:
la source
Python 3,
590639 caractèresC'est la solution simple: utilisez des générateurs pour définir chacune des séquences infinies, et tant que l'intersection n'est pas assez grande, ajoutez une étape à chaque séquence.
Pour tenir compte de la séquence de Hofstadter qui ne croît pas de manière monotone: à chaque étape, j'en génère deux fois plus pour cette séquence, par exemple 1, puis 2, 4, 8, 16, 32, etc. Je pense que cela satisfait la limite indiquée dans la question , et c'est toujours assez rapide pour tous les cas de test qui y sont présentés.
la source
from itertools import count as C
->from itertools import*
C=count
,def s(i):return D(i)==1
->s=lambda i:D(i)==1
(je ne pense même pas que cette fonction le raccourcisse ...),"{0:04b}".format(int(L)))if U>'0'
->"{0:04b}".format(int(L)))if'0'<U
C #, 1923
Ce ne sera probablement pas le programme le plus court mais j'ai trouvé le défi intéressant, alors voici ma solution.
Exécuter les 4 avec 35 numéros (15 35) prend environ 5 secondes.
Vous pouvez le tester ici , mais notez que si vous voulez OEIS4, la quantité de chiffres que vous voulez doit être petite ou netfiddle manque de mémoire.
Golfé
Lisible
Explication
Cela utilise bigtime d'évaluation paresseuse qui le rend très rapide i bellieve. De plus, j'étais paresseux à faire n'importe quel "bitlogic" en utilisant la méthode Convert.ToString (nombre, 2) des frameworks. Cela transforme n'importe quel nombre en sa représentation binray sous forme de chaîne.
J'ai dû écrire ma propre méthode pour intersecter les seuils car l'intersection Linq-Method calcule l'intersection de la séquence complète, et c'était littéralement impossible.
la source