Affiche le Nième terme de la séquence de Van Eck.
La séquence de Van Eck est définie comme:
- Commence par 0.
- Si le dernier terme est la première occurrence de ce terme, le prochain terme est 0.
- Si le dernier terme s'est déjà produit, le nombre suivant de pas en arrière correspond au dernier événement.
https://www.youtube.com/watch?v=etMJxB-igrc
https://www.youtube.com/watch?v=8VrnqRU7BVU
Séquence: 0,0,1,0,2,0,2,2,1,6,0,5,0,2, ...
Tests:
Entrée | Sortie
- 1 | 0
- 8 | 2
- 19 | 5
- 27 | 9
- 52 | 42
- 64 | 0
MODIFIER
1 indexé est préféré, 0 indexé est acceptable; cela pourrait changer certaines des solutions déjà présentées.
Juste le Nième terme s'il vous plaît.
Idem (à l'exception de la partie déjà affichée), il semble que les golfeurs et les observateurs de numérosphiles se chevauchent de manière décente.
n
termes?Réponses:
JavaScript (ES6),
46 4137 octetsEssayez-le en ligne!
Comment?
Nous n'avons pas besoin de stocker la séquence complète. Nous devons seulement garder trace de la dernière position de chaque entier qui apparaît dans la séquence. Nous utilisons l'objet sous-jacent de la fonction récursiveg à cette fin.
Pour un terme donnép , nous n'avons pas besoin non plus de régler g[p] sur sa position absolue réelle dans la séquence car nous ne sommes intéressés que par la distance avec la position actuelle. C'est pourquoi nous pouvons simplement stocker la valeur actuelle de l'entrée n , qui sert de compteur de décrémentation dans le code.
Par conséquent, la distance est donnée parg[p]−n . Cela équivaut à NaN s'il s'agit de la première occurrence de p , qui peut facilement être convertie en 0 attendu .
Commenté
la source
Python 3 ,
696362 octetsEssayez-le en ligne!
Remarque: comme l'a mentionné Erik the Outgolfer, ce code fonctionne également dans Python 2.
0-indexé (bien que, pour être tout à fait pervers, vous pouvez le faire -1 indexé en changeant
if n
àif~n
: P)Utilise le superbe "opérateur étoile" de décompression de Python, pour construire la série de manière récursive, jusqu'à
n
atteindre zéro.La fonction construit la série dans l'ordre inverse, pour éviter de l'inverser pour la recherche. De plus, il stocke les négations de tous les éléments, car leur conversion à la fin était libre (sinon,
-
il aurait fallu que ce soit un espace) et cela nous évite de perdre un octet en cours de route, en utilisant~s.index(l)
plutôt que-~s.index(l)
.Pourrait être de 51 octets si les tuples Python avaient les mêmes
find
fonctions que les chaînes (renvoyer -1 si non trouvé, au lieu de générer une erreur), mais pas de chance ...la source
s
de décompresser pour l'appel récursif?def func(f, *args): f(*args)
; le déballage des appels de fonction est valide py2. Qu'est-ce que py3-only consiste à décompresser dans une liste / une compréhension de dict (c'est-à-dire[1, 2, *s]
) ou des variables déballer:a, *b = [1,2,3,4]
.R , 62 octets
Essayez-le en ligne!
Construit la liste à l’inverse;
match
renvoie le premier index deF[1]
(la valeur précédente) dansF[-1]
(le reste de la liste), retournant0
si aucune correspondance n'est trouvée.F
est initialiséFALSE
et forcé0
lors du premier passage de lawhile
boucle.la source
match
de ce problème lorsque vous le construisez de cette façon. Vraiment propre.F
le0
retour,n==1
sinonFALSE
.Perl 6 ,
4742 octets-5 octets grâce à nwellnhof
Essayez-le en ligne!
Codeblock anonyme qui sort l'élément 0-indexé dans la séquence.
Explication:
la source
Bourne shell, 102 octets
essayez-le en ligne
la source
Stax ,
10 à9 octetsExécuter et déboguer
Si l'indexation basée sur 0 est autorisée:
Stax , 8 octets
Exécuter et déboguer
la source
J ,
2923 octetsEssayez-le en ligne!
Le vrai travail se fait dans le verbe d'itération du verbe de pouvoir
^:
, qui itère autant de fois que l'argument[
, en commençant l'itération avec la valeur constante 0&0
...(#|1+}.i.{.)
C'est ce que itère. Le décomposer ...}.i.{.
Trouvez l'index dei.
la tête de liste{.
dans la queue de la liste}.
. Cela retournera un index basé sur 0, donc si l'élément actuel est trouvé 1 précédent, il retournera 0. S'il n'est pas trouvé, il retournera la longueur de la liste, c'est-à-dire la longueur de la queue.1+
Ajoutez un à la valeur à corriger pour l'indexation basée sur 0, étant donné que "quelle distance en arrière" de Ven Eck est basé sur 1. Notez que s'il n'a pas été trouvé, la valeur sera désormais la longueur de la liste complète.#|
Renvoie le reste de la valeur calculée à l'étape précédente, lorsqu'elle est divisée par la longueur de la liste complète. Notez que ceci transforme "non trouvé" en 0, mais laisse toutes les autres valeurs inchangées.,~
Ajoutez la nouvelle valeur au début de la liste. Nous utilisons l'avant plutôt que le dernier pour plus de commodité.1{
renvoie le 2e élément de la liste, car nous en avons calculé un trop souvent, car il est plus court.la source
Python , 51 octets
Essayez-le en ligne!
Sorties
False
pour0
. Implémente littéralement la spécification, en recherchant le plus petit entier positifi
tel quef(n-1)==f(n-i-1)
. Si une telle recherche aboutit ài>=n
, l'élément précédent n'est pas apparu auparavant et nous produisons0
.Au lieu de faire quelque chose de raisonnable, comme de stocker des valeurs antérieures dans une liste, la fonction les recalcule de manière récursive à partir de zéro, chaque fois que cela est nécessaire, et parfois même si elles ne le sont pas. Cela rend la fonction très lente pour les entrées supérieures à 10 ou plus.
la source
APL (Dyalog Unicode) ,
1917 octets SBCS deUn grand merci à ngn, Adám, Richard Park et H.PWiz pour leur aide dans l’écriture et le golf de cette réponse dans The APL Orchard. , un endroit formidable pour apprendre l’APL et obtenir de l’aide.
Éditez: -2 octets d'Adám.
Essayez-le en ligne!
Explication
la source
Wolfram Language (Mathematica) , 48 octets
Essayez-le en ligne!
Les valeurs non nulles sont renvoyées sous forme de listes de singleton .
la source
05AB1E , 8 octets
Essayez-le en ligne ou sortez le premiern valeurs dans la liste .
Explication:
la source
F¯Rćk
? ;)Java,
968076 octetsNon obscurci:
la source
int[]
dans laint
déclaration, et également utiliser à la<1
place de==0
. Exemple:int f(int n){int l[]=new int[n],i=0,j,v=0;while(++i<n){j=l[v];l[v]=i;v=j<1?0:i-j;}return v;}
n->{int l[]=new int[n],i=0,j,v=0;for(;++i<n;l[v]=i,v=j<1?0:i-j)j=l[v];return v;}
Charbon de bois , 23 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
Définissez le premier terme sur 0.
n-1
Temps de boucle . (Si l'indexation 0 est acceptable, vous⊖
pouvez la supprimer pour une sauvegarde de 1 octet.)Le terme suivant est l'index incrémenté du terme actuel dans la liste inversée des termes précédents.
Ajoutez le terme actuel à la liste des termes précédents.
Définissez le terme actuel sur le prochain terme.
Imprimer le terme actuel à la fin de la boucle.
la source
Gelée , 7 octets
Essayez-le en ligne!
0 indexé.
la source
Gelée , 8 octets
Un lien monadique acceptant un entier positif,n qui donne la nt h terme de la séquence de Van Eck.
Essayez-le en ligne!
Comment?
Notez que sans la finale,
Ḣ
nous avons effectivement recueilli[a(n), a(n-1), ..., a(2), a(1), n]
la source
C (gcc) , 63 octets
Essayez-le en ligne!
0 indexé.
la source
Haskell ,
68 ans 6766 octetsImplémentation assez simple (utilisant une indexation basée sur 0).
Essayez-le en ligne!
la source
Haskell, 61 octets
Indexation basée sur 0.
Essayez-le en ligne!
la source
Japt
-h
, 11 octetsL'essayer
la source
C # (compilateur interactif Visual C #) , 77 octets
Essayez-le en ligne!
A peu près un portage de la réponse Java à ce stade.
la source
Python 3 ,
12811411110299 octets102 -> 99 octets, grâce à Jonathan Frech
Essayez-le en ligne!
la source
-
au lieu de!=
sauvegarder un octet.Perl 5 (
-p
), 42 octetsEssayez-le en ligne!
la source
Python 3 , 112 octets
Essayez-le en ligne!
-3 octets grâce à mypetlion
la source
for _ in a*int(input()):k=a[-1];a+=k in a[:-1]and[a[::-1].index(k)+~a[-2::-1].index(k)]or[0]
économiser 3 octets.Rouge ,
10695 octetsEssayez-le en ligne!
la source
CJam (15 octets)
Démo en ligne . Ceci est un programme complet et indexé par 0.
Dissection
la source
Clojure, 69 octets
Malheureusement, une approche plus fonctionnelle semble être plus longue.
la source
DC,
949190 octetsL'entrée est prise pendant le programme. Enregistrez ceci dans un fichier puis faites "dc" pour le lancer. Ce n'est certainement pas le plus court, mais je m'amuse avec des défis comme ceux-ci en dc L'entrée est un index basé sur 1, selon les préférences.
la source
C ++ (clang) ,
241235234219197189 octets197 -> 189 octets, grâce à ceilingcat
Essayez-le en ligne!
la source
Pyth , 18 octets
Essayez-le en ligne!
Construit la séquence en sens inverse et affiche le premier élément (dernier terme de la séquence).
la source