Nous commençons par une séquence vierge indexée sur 1:
_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,...
Dans la n ème étape, nous remplissons tous les a (n) blancs avec les entiers supérieurs à 1 en commençant par le premier blanc restant, où a (n) est la n ème entrée de la séquence.
Après la première étape:
2,_,3,_,4,_,5,_,6,_,7,_,8,_,9,_,10,_,11,_,12,_,13,_,...
Notez que a (1) doit être 2 car le premier entier supérieur à 1 est 2.
Dans la deuxième étape, nous remplissons tous les a (2) blancs. Il sera évident que a (2) doit être 2.
2,2,3,_,4,3,5,_,6,4,7,_,8,5,9,_,10,6,11,_,12,7,13,_,...
Dans la troisième étape, nous remplissons tous les a (3) blancs. De la séquence, a (3) = 3.
2,2,3,2,4,3,5,_,6,4,7,_,8,5,9,3,10,6,11,_,12,7,13,_,...
Dans la quatrième étape, nous remplissons tous les a (4) blancs. De la séquence, a (4) = 2.
2,2,3,2,4,3,5,2,6,4,7,_,8,5,9,3,10,6,11,3,12,7,13,_,...
Finalement:
2,2,3,2,4,3,5,2,6,4,7,2,8,5,9,3,10,6,11,3,12,7,13,2,...
Tâche
Étant donné n, retournez le n ème élément de la séquence.
Les 10 000 000 premiers termes de la séquence peuvent être trouvés ici .
C'est du code-golf . La réponse la plus courte en octets l'emporte. Des échappatoires standard s'appliquent.
Réponses:
Haskell ,
8067 octetsEssayez-le en ligne!
Haskell est le langage parfait pour définir une liste infinie en termes de lui-même.
la source
let
gardes de modèle.pattern1 | let pattern2 = expr2 = expr1
signifie la même chose quepattern1 = let pattern2 = expr2 in expr1
(pour la même raison cela[expr1 | let pattern2 = expr2]
signifie la même chose que[let pattern2 = expr2 in expr1]
).let
des gardes de modèle (surtout qu'ils peuvent faire des fonctions)! En outre,m=2:2:2`drop`g m
est un octet plus court.(!!)$0:m
est de deux octets plus court.2:2:
substance entièrement avec un peu plus de paresse:g ~(a:b)|...
etm=g m
.C, 123 octets
Essayez-le en ligne!
Procédure pas à pas
Allouer un tableau de n entiers pour stocker les n premiers éléments de la séquence. Ce code dur
sizeof(int)
comme4
, qui est une hypothèse sûre dans la plupart des cas et certainement que je suis prêt à faire dans le contexte du golf de code. :)Ce sont tous des compteurs:
i
pour l'index de l'étape sur laquelle nous nous trouvons,j
parcourir la séquence à la recherche d'espaces vides etk
compter le nombre d'espaces vides qui ont été vus.Avant de commencer notre boucle principale, nous nous faufilons dans une initialisation des deux premiers éléments de la séquence pour
2
. (p[0]
=*(p + 0)
=*p
.) Cela jette le décompte pourk
, cependant, mais ...... nous faisons également une initialisation sournoise de
k
, qui teste sii
est inférieur à2
et corrige la valeur de départ dek
si oui. La boucle intérieure commence également ici, qui itère sur toute la séquence jusqu'à présent à chaque étape.Cette ligne pourrait vraiment utiliser quelques explications. Nous pouvons l'étendre à:
par court-circuitage, puis par les lois de De Morgan et le fait qu'il
0
est faux en C:Cela indique essentiellement: "si cet espace est vide, incrémentez
k
. Et s'ilk
s'agissait auparavant d'un multiple de la taille de l'étape, exécutez l'instruction suivante." Par conséquent, nous exécutons l'instruction sur chaque élément de taille de pas , ce qui est exactement la façon dont la séquence est décrite. La déclaration elle-même est simple; tout ce qu'il fait est de générer2
,3
,4
, ....En utilisant le retour délicat sans retour qui fonctionne avec
gcc
, nous «renvoyons» le dernier élément des n premiers termes de la séquence, qui se trouve être le n ème terme.la source
Pyth, 29 octets
Essayez-le en ligne
Comment ça marche
Au lieu de jouer avec les listes, cela utilise une formule récursive simple.
la source
Haskell , 67 octets
Essayez-le en ligne!
Une solution arithmétique récursive qui s'est avérée essentiellement la même méthode que la réponse Pyth d'Anders Kaseorg .
Ce code est couvert de verrues - des parties laides qui semblent pouvoir être jouées au golf, mais je n'ai pas vu comment.
La fonction
i%j
veut vraiment utiliser un garde pour vérifier simod i(f j)>0
et évaluer l'une des deux expressions correspondantes. Mais, les deux expressions utilisentdiv i(f j)
. Lier cela dans un garde ne le fera pas s'appliquer aux deux côtés. Autant que je sache, on ne peut pas faire en sorte qu'un garde "se répartisse" sur les autres gardes.let
etwhere
sont trop longs. Ainsi, le code utiliselast
pour choisir l'une des deux expressions pendant que le garde lie la variable. Pouah.Idéalement, nous utiliserions
divMod
parce que les deuxdiv
etmod
sont utilisés, mais(d,m)<-divMod ...
c'est une longue expression. Au lieu de cela, nous vérifions de manière hackeuse que le mod n'est pas nul en voyant si ladiv
valeur multipliée par le diviseur est inférieure à la valeur d'origine.L'
0%j=2
affaire ne serait pas nécessaire si Haskell court-circuitediv 0
, ce qui n'est pas le cas. Le.pred
convertit l'entrée indexée 1 en indexée zéro, sinon il y aurait des-1
corrections partout.la source
%
index 1, vous avez besoin d'une correction de cinq octets - qui ne fait que lier. Cependant , vous pouvez alors en lignef
en%
sans frais, puisf
devient anonyme si vous enregistrez deux octets d' ensemble.f
sans perdre d'octets.divMod
semble être un octet moins cher, car il permet la ramification avec!!(0^m)
. Jusqu'à présent, j'ai:1%j=2;i%j|(d,m)<-divMod(i-1)$j%1=[(i-d-1)%(j+1),d+2]!!(0^m);(%1)
.pred
.JavaScript (ES6),
989391 octetsUne fonction récursive qui s'arrête dès que le résultat est disponible.
Version alternative, 90 octets
Suggéré par Shaggy pour -1 octet
Celui-ci doit être appelé avec
f(n)()
. Bien que le poste correspondant en méta donne actuellement un score positif, cette syntaxe est apparemment contestée.Démo
Afficher l'extrait de code
la source
n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%k?c:++v:(i=1,v=2),i=0,k=a[p]||2))
devrait fonctionner pour 92 octets. Appelez-le avecf(n)()
.Java 8, 124 octets
Expression lambda.
Crée un tableau entier et le remplit continuellement jusqu'à ce que la nième valeur soit remplie.
Pré-déclaration des variables en haut pour réduire autant de déclarations que possible car chacune
int
coûte 4 octets d'espace au lieu d'ajouter,n
2.À la
j
'ième itération de calcul, le nombre de' blancs 'qu'il faut sauter est égal àa[j]
(ou 2, si vide). Il se trouve que si le premier espace vide que nous devons remplir est en positionk
,k * a[j]
nous donne le «step» (s
).la source