Supposons que nous ayons un tableau de longueur avec des pointeurs pointant vers un emplacement dans le tableau: Le processus de " saut de pointeur " définira chaque pointeur sur l'emplacement vers lequel le pointeur vers lequel il pointe.
Aux fins de ce défi, un pointeur est l'index (de base zéro) d'un élément du tableau, cela implique que chaque élément du tableau sera supérieur ou égal à et inférieur à . En utilisant cette notation, le processus peut être formulé comme suit:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Cela signifie (pour ce défi) que les pointeurs sont mis à jour sur place dans un ordre séquentiel (c'est-à-dire des indices inférieurs en premier).
Exemple
Voyons un exemple, :
Donc, après une itération de " saut de pointeur ", nous obtenons le tableau .
Défi
Étant donné un tableau avec des indices, le tableau obtenu en itérant le saut de pointeur décrit ci-dessus jusqu'à ce que le tableau ne change plus.
Règles
Votre programme / fonction prendra et retournera / affichera le même type, une liste / vecteur / tableau etc. qui
- est garanti non vide et
- est garanti pour ne contenir que les entrées .
Variantes: vous pouvez choisir
- d'utiliser l'indexation basée sur 1 ou
- utiliser des pointeurs réels,
cependant, vous devez le mentionner dans votre soumission.
Cas de test
[0] → [0]
[1,0] → [0,0]
[1,2,3,4,0] → [2,2,2,2,2]
[0,1,1,1,0,3] → [0,1,1,1,0,1]
[4,1,3,0,3,2] → [3,1,3,3,3,3]
[5,1,2,0,4,5,6] → [5,1,2,5,4,5,6]
[9,9,9,2,5,4,4,5,8,1,0,0] → [1,1,1,1,4,4,4,4,8,1,1,1]
n
comme entrée supplémentaire?
#[[#]]&~FixedPoint~#&
.