Permet de définir une séquence de pointeur pour être une séquence telle que a (n) = a ((n-1) - (a (n-1))) forall n supérieur à un certain nombre fini. Par exemple, si notre séquence a commencé par
3 2 1
Notre prochain terme serait 2
, car a (n-1) = 1 , (n-1) -1 = 1 , a (1) = 2 (cet exemple est un indice zéro, mais peu importe l'indice que vous utilisez, le calcul sera toujours être le même.). Si nous répétons le processus, nous obtenons la séquence infinie
3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2
Tâche
Étant donné un tableau initial d'entiers positifs, affichez la séquence de pointeurs commençant par ce tableau.
Types de sortie
La sortie est censée être flexible, si vous choisissez d'écrire une fonction en tant que programme, elle peut renvoyer, soit une liste infinie d'entiers ou une fonction qui indexe la séquence. Si vous choisissez d'écrire un programme complet, vous pouvez sortir indéfiniment les termes de la séquence.
Vous pouvez également choisir de prendre deux entrées, le tableau de départ et un index. Si vous choisissez de le faire, vous devez uniquement afficher le terme de la séquence à cet index.
Vous ne recevrez jamais une séquence qui nécessite une indexation avant le début de la séquence. Par exemple, 3
n'est pas une entrée valide car vous auriez besoin de termes avant le 3
pour résoudre le terme suivant.
Il s'agit de code-golf, donc votre score sera le nombre d'octets de votre programme, un score inférieur étant meilleur.
Cas de test
les cas de test sont tronqués pour plus de simplicité
2 1 -> 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 ...
2 3 1 -> 2 3 1 3 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 2 1 2 ...
3 3 1 -> 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 3 3 1 3 ...
4 3 1 -> 4 3 1 3 4 4 3 3 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 4 4 4 3 4 ...
Réponses:
JavaScript (ES6), 25 octets
Une fonction anonyme qui, lorsqu'elle est appelée, crée une fonction
f
qui donne l'élément à un index donné dans la séquence.S'il vous plaît laissez-moi savoir si j'ai mal compris quoi que ce soit ...
la source
f(n)
depuisf(n)
. Je ne pense pas que cela se terminera jamais, mais je ne connais pas JS.n
est suffisamment bas, lea[n]
retourne une valeur vraie, donc le||
court-circuit et l'empêche de se reproduire à l'infini.n
ne diminue pas à chaque appel. Je suis à peu près sûr que sin
la longueur dea
vous ne s'arrêtera jamais.--n
affectez-len
àn-1
la référence suivante qui fera référence à la décrémentationn
.--n
décrémentsn
, ce qui signifie quef(--n-f(n))
est le même quef((n-1)-f(n-1))
Husk ,
76 octetsRenvoie une liste infinie. Essayez-le en ligne! Notez qu'il faut un certain temps à TIO pour tronquer et imprimer le résultat.
Explication
L'opérateur
¡
a plusieurs significations. Ici, j'utilise "construire une liste infinie en itérant une fonction qui calcule un nouvel élément à partir de la liste des éléments existants". Étant donné une liste de longueur N , le nouvel élément aura un indice basé sur 1 N + 1 . Tout ce que nous devons faire est de nier le dernier élément de la liste (qui est la valeur précédente) et d'indexer dans la liste en utilisant le résultat.la source
Haskell , 36 octets
Prend une liste et retourne une fonction qui indexe la séquence
Essayez-le en ligne!
Explication
Nous définissons ici une fonction
!
qui prend une listel
et un indexn
. Sin
est inférieure à la longueur del
nous indexl
parn
, sinon nous reviendronsl!((n-1)-l!(n-1))
. Cela suit la définition récursive de la fonction que j'ai donnée dans la question.Voici le même programme non golfé.
Je l' utilise au
e<-n-1
lieu d'ailleurs économiser des octets tout en attribuantn-1
à dee
sorte qu'il peut être utilisé plus tard.la source
MATL ,
139 octetsGénère les termes initiaux suivis de n termes supplémentaires (autorisés par le défi), où n est un entier positif pris en entrée.
Essayez-le en ligne!
Explication
la source
Mathematica, 63 octets
prend deux entrées
Essayez-le en ligne!
-3 octets de Martin Ender
la source
R , 55 octets
Essayez-le en ligne!
Prend deux entrées.
la source
ML standard (MLton) , 58 octets
Essayez-le en ligne! La fonction
a
prend la liste initiale et un index et renvoie l'élément de séquence à cet index. Exemple d'utilisation:a [4,3,1] 5
rendements4
.la source
Gelée , 6 octets
Prend une séquence S et un nombre entier k , et ajoute k termes de S .
Essayez-le en ligne!
Comment ça fonctionne
la source
Python 2 , 48 octets
Essayez-le en ligne!
la source
CJam, 10 octets
Pour CJam, cela fonctionne très bien (il bat même 05ab1e!).
Il s'agit d'un bloc anonyme qui attend une entrée sous la forme
i n
sur la pile, où sei
trouve l'index dans la séquence etn
est un tableau de nombres de départ.La raison pour laquelle cela fonctionne si bien est due à l'
j
opérateur, qui fournit une récursivité mémorisée à partir d'un ensemble de valeurs de départ.Explication:
la source
Java (8), 60 octets
Prend deux entrées (tableau
a
entier et entiern
), et sort lan
'e valeur de la séquence.Explication:
Essayez-le ici. (Cela pourrait prendre quelques secondes.)
la source
Perl, 38 +3 (-anl) octets
Essayez-le en ligne
la source
05AB1E , 20 octets
Attend l'entrée comme une chaîne séparée par des espaces, continue de produire indéfiniment; mise en œuvre assez simple
Exemple d'exécution:
la source
Java (OpenJDK 8) ,
95939190 octetsEssayez-le en ligne!
la source
b[(j-1)-...]
équivalent àb[~-j-...]
?j>=a.length
pourj<a.length
sauver un octet:j<a.length?a[j]:b[~-j-b[j-1]]
. Je suis également curieux: pourquoi avez-vous opté pour une approche en boucle, alors que l' approche récursive qui est également expliquée dans la description du défi elle-même ne fait que 60 octets?Perl 5 ,
-a
30 octetsEssayez-le en ligne!
la source