Considérez la séquence suivante:
0 1 3 2 5 4 8 6 7 12 9 10 11 17 13 14 15 16 23 ...
Semble assez sans motif, non? Voici comment ça fonctionne. En commençant par 0
, sauter des n
entiers, en n
commençant par 1
. C'est le numéro suivant de la séquence. Ensuite, ajoutez tous les nombres "sautés" et qui n'ont pas encore été vus dans l'ordre croissant. Ensuite, incrémentez n
et sautez du dernier nombre ajouté. Répétez ce modèle.
Ainsi, par exemple, lorsque nous atteignons 11
, nous y sommes n=5
. Nous incrémentons n
pour être n=6
, sautons à 17
, puis ajoutons 13 14 15 16
puisque ceux-ci n'ont pas encore été vus. Notre prochain saut est n=7
, donc l'élément suivant de la séquence est 23
.
Le défi
Étant donné l'entrée x
, sortez le x
terme de cette séquence, les premiers x
termes de la séquence, ou créez une liste infinie des termes de la séquence. Vous pouvez choisir l'indexation 0 ou 1.
E / S et règles
- L'entrée et la sortie peuvent être fournies par n'importe quelle méthode pratique .
- L'entrée et la sortie peuvent être supposées correspondre au type de numéro natif de votre langue.
- Un programme complet ou une fonction sont acceptables. S'il s'agit d'une fonction, vous pouvez renvoyer la sortie plutôt que de l'imprimer.
- Les failles standard sont interdites.
- Il s'agit de code-golf, donc toutes les règles de golf habituelles s'appliquent et le code le plus court (en octets) l'emporte.
Réponses:
JavaScript (ES7), 41 octets
Renvoie le nième terme de la séquence, indexé 0.
Essayez-le en ligne!
Comment?
Cas principal:n>3
Les quatre premiers termes de la séquence sont spéciaux, alors mettons-les de côté pour l'instant.
Pour , la séquence ressemble à ceci:n>3
On peut remarquer qu'il existe en fait deux sous-séquences entrelacées:
La plupart des valeurs appartiennent à la sous-séquence pour laquelle nous avons simplement:A
Certaines autres valeurs appartiennent à la sous-séquence (mise en évidence entre parenthèses dans le schéma ci-dessus) dont les indices suivent la séquence arithmétique 3, 3, 4, 6, 9, 13, 18, 24 ... et pour laquelle nous avons:B
où est l'indice dans la séquence principale et k est l'indice de la sous-séquence B .n k B
Les indices de dans la séquence principale sont donnés par:B
Étant donné , nous savons que le terme correspondant dans la séquence principale appartient à B si n est une solution entière de l'équation quadratique:n B n
dont le discriminant est:
et dont la solution positive est:
Nous attendons pour être un entier. D'où le test:Δ−−√
Cas particuliers:0≤n≤3
Pour , le discriminant est négatif et prend sa racine carrée dans NaN . Pour n = 3n<3 n=3 , le discriminant est . Par conséquent, ces quatre premiers termes de la séquence sont considérés comme appartenant à la sous-séquence B .1 B
Si nous appliquions simplement notre formule standard n - ~ d / 2 , nous obtiendrions:
au lieu de:
C'est pourquoi nous avons XOR ces résultats avec .0,1,2 and 1
la source
Husk , 12 octets
Essayez-le en ligne!
Sorties sous forme de liste infinie. Voici une version qui imprime le premier N .
Explication
la source
Haskell , 43 octets
Essayez-le en ligne!
Définit une liste infinie:
la source
Gelée , 15 octets
Il s'agit d'un programme complet qui, étant donné n , imprime les n premiers éléments de la séquence.
Essayez-le en ligne!
Comment ça fonctionne
la source
C (gcc),
736764 octetsEssayez-le en ligne!
Définit une fonction
f
qui prend l'index 0n
et produit len
numéro e dans la séquence.Nous pouvons analyser la séquence comme suit:
Nous traitons d'abord la section centrale:
Notez que les arguments de gauche (4, 6, 9, 13, ...) suivent un modèle: ajoutez d'abord deux, puis ajoutez trois, puis ajoutez quatre, et ainsi de suite. Nous commençons à
t=4
et ajoutonsd
(qui commence à 2) chaque itération de la boucle, incrémentantd
dans le processus.Le corps de la boucle est plus intéressant. N'oubliez pas que nous voulons cartographier 4 à 5, 6 à 8, 9 à 12, etc .; c'est juste ajouter
d-1
six
c'estt
. Cependant, cette logique précède le dernier cas,f(n) = n - 1
donc nous savons que nous allons soustraire 1 à la fin. Par conséquent, nous pouvons simplement ajouterd
ifx == t
(x-t||(x+=d)
). Cependant, nous aurons aussi besoin de sortir de la boucle immédiatement après cela - si l' on ajoute que pourd
obtenir l'aspect absurded+=x+=d
, ce qui fera toujours l'd<x
échec condition.Cela couvre tout sauf les quatre premières valeurs. En les regardant en binaire, on obtient:
Donc, nous voulons retourner le dernier bit si
2 <= x < 4
. Ceci est accompli avecx^x/2
.x/2
donne le deuxième bit le moins significatif, donc XORing cela avec le numéro d'origine retourne le dernier bit si le nombre est 2 ou 3.la source
Gelée ,
1310 octets-3 Merci à Dennis (utilisez l'indexation 0 pour sauver 2 de la configuration de la somme cumulée et d'un décrément final)
Un lien monadique acceptant un entier, 0- indexé n , qui renvoie un entier, a (n)
Essayez-le en ligne! Ou voir une suite de tests
la source
ḶÄ+3i+’
, mais aucune idée de comment gérer les cas de bord.Ḷ»ạ¥3
pourḊ3,2;
- le sentiment qu'il devrait y avoir un terser pour ce morceau.Ḷ»2Äi+_>2$
enregistre 3 octets, avec une indexation basée sur 0.Perl 5 avec
-pl
, 70 octetsEssayez-le en ligne!
la source
MATL , 22 octets
Sort les premiers
n
termes de la séquence.Essayez-le en ligne!
Explication
la source
Haskell , 51 octets
Essayez-le en ligne!
Un peu plus longtemps que la réponse de Lynn Haskell , mais l'approche différente pourrait néanmoins être intéressante.
la source
Rubis , 73 octets
Essayez-le en ligne!
Fonction récursive qui renvoie les premiers x nombres de la liste.
la source
QBasic, 58 octets
Sorties indéfiniment. Vous voudrez peut-être ajouter un
SLEEP 1
à l'intérieur de la boucle ou le faireLOOP WHILE b<100
ou quelque chose comme ça afin de voir les résultats.Cela implémente simplement la spécification. Notez que les chiffres pour lesquels nous revenons seront toujours les numéros entre le dernier numéro sauté et le numéro sauté avant celui-ci. Nous stockons donc ces limites sous
a
etb
et utilisons uneFOR
boucle pour imprimer tous les nombres entre elles.la source
05AB1E , 14 octets
Essayez-le en ligne!
la source
R , 70 octets
Essayez-le en ligne!
F
constante grâce à la suggestion @JADsetdiff
au lieu dex[x %in% y]
Version précédente (79 octets)
la source
5 bytes
et provoque un tas d'avertissements!F/T
ne sont pas redéfinis lors de la définition de la fonction. Il (IIRC) ne modifie pas la valeur globale pourF/T
Python 2 , 123 octets
Essayez-le en ligne!
Étant donné l'entrée x, sortir les x premiers termes de la séquence,
J'apprends Python et ces défis rendent les choses plus intéressantes.
Modifier: raser des espaces
la source
for n in range(1,z) if len(s) < z]; return s
:for n in range(1,z)if len(s)<z];return s
.Gelée , 16 octets
Essayez-le en ligne!
Un octet de plus que la réponse Jelly existante, mais cela pourrait éventuellement être joué un peu.
RÄṬŻk²Ḋ$
pourrait peut-être être plus court.18 octets
Plus long mais différent.
la source
Rubis , 63 octets
Essayez-le en ligne!
0 indexé. Peut probablement être joué au golf.
la source
Perl 6 , 52 octets
Essayez-le en ligne!
Il s'agit d'une expression de générateur utilisant l'
...
opérateur. Il recherche les lacunes dans la séquence précédente@_
via((^max @_)∖@_).min.?key
:Le
?
est nécessaire pour la valeur initiale qui n'a pas de.key
. Si aucun écart n'est trouvé, il ajoute n (ici dans la$
variable) à la dernière valeur de la liste, plus un pour les erreurs désactivées par 0.la source
Python 3 , 104 octets
Essayez-le en ligne!
Étant donné l'entrée x, sortir les x premières "séquences"
la source