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~#&
.Réponses:
JavaScript, 36 octets
Modifie le tableau d'entrée d'origine.
Essayez-le en ligne
la source
Haskell, 56 octets
Haskell et les mises à jour sur place sont un mauvais match.
Essayez-le en ligne!
la source
Python 2 , 53 octets
Essayez-le en ligne!
-6 grâce à HyperNeutrino .
Modifie
l
le résultat en place.la source
C ++ 14 (gcc) , 61 octets
Comme lambda générique sans nom. Nécessite des conteneurs séquentiels comme
std::vector
.Essayez-le en ligne!
la source
Swift ,
6853 octetsEssayez-le en ligne!
-15 grâce à BMO
la source
f=
). Bon séjour ici!map
au lieu deforEach
le raccourcir?JavaScript (ES6), 41 octets
Essayez-le en ligne!
la source
05AB1E (hérité) , 8 octets
Essayez-le en ligne!
Explication
05AB1E , 14 octets
Essayez-le en ligne!
la source
Japt,
15137 octetsModifie le tableau d'entrée d'origine.
Essayez-le (des octets supplémentaires sont pour écrire l'entrée modifiée sur la console)
la source
Java 8,
10554 octetsModifie le tableau d'entrée au lieu d'en renvoyer un nouveau pour économiser des octets.
Essayez-le en ligne.
Explication:
la source
Japt , 17 octets
Essayez tous les cas de test
Cela semble être plus court, mais malheureusement, ma pensée initiale
UmgU
ne fonctionne pas, car chacung
accède à l'originalU
plutôt que de le modifier à chaque étape. La préservation de différents composants coûte également une poignée d'octets.Explication:
la source
C (clang) , 32 bits,
4944 octetsEssayez-le en ligne!
Utilise des pointeurs.
5045 octets avec des entiers:Essayez-le en ligne!
la source
Rubis ,
3734 octetsEssayez-le en ligne!
Renvoie en modifiant le tableau d'entrée sur place.
la source
Rouge , 63 octets
Essayez-le en ligne!
Modifie le tableau en place
la source
R ,
6058 octets-2 octets grâce à @digEmAll pour avoir lu les règles.
Essayez-le en ligne!
1 indexé.
n
est la longueur du tableau d'entrée.rep(1:n,n)
reproduit les1:n
n
temps (par exemplen=3 => 1,2,3,1,2,3,1,2,3
)Parcourez les
n
temps de tableau . L'état stable sera atteint d'ici là à coup sûr, en fait d'ici la fin de la n-1 fois à travers je pense. La preuve est laissée au lecteur.la source
+1
et prendre simplement l'entrée basée sur 1, le message indique: Vous pouvez choisir d'utiliser l'indexation basée sur 1scan()
pour entrée. J'ai toujours l'impression que messcan()
solutions ne sont pas optimales, alors gardez un œil sur une manière plus courte de les assignerx
etn
ensemble:n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x
essayez-la en ligne!Lisp commun,
5958 octetsEssayez-le en ligne!
la source
Nettoyer , 80 octets
Essayez-le en ligne!
la source
Clojure , 136 octets
Essayez-le en ligne!
la source
loop [
ne peut pas devenirloop[
?Perl 5,
353426 octetsen utilisant le fait que la convergence est atteinte au maximum pour le nombre de taille d'itérations
26 octets
34 octets
35 octets
la source
Clojure , 88 octets
Essayez-le en ligne!
la source
Fusain , 16 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Malheureusement, toutes les fonctions de mappage habituelles ne fonctionnent que sur une copie du tableau, le résultat étant qu'elles permutent simplement les éléments plutôt que de les sauter, le code doit donc tout faire manuellement. Explication:
Répétez la boucle intérieure une fois pour chaque élément. Cela garantit simplement que le résultat se stabilise.
Faites une boucle sur les indices du tableau.
Obtenez l'élément de tableau à l'index en cours, utilisez-le pour indexer dans le tableau et remplacez l'élément en cours par cette valeur.
Castez les éléments en chaîne et imprimez implicitement chacun sur leur propre ligne.
la source
F #,
7473 octetsRien de spécial. Utilise l'idée de module vue dans d'autres réponses.
la source
K, 27 octets
{..}/
applique lambda {..} sur arg (jusqu'à convergence)intérieur lambda extérieur:
{..}/[x;y]
applique lambda de manière itérative sur x (mis à jour à chaque itération) et un élément de y (y est une liste de valeurs, et utilise un élément à chaque itération). Dans ce cas, arg y est!#x
(jusqu'au nombre x, c'est-à-dire les index du tableau)@[x;y;:;x x y]
modifier le tableau x (à l'index y attribuer x [x [y]])la source
APL (Dyalog Unicode) , 26 octets SBCS
A besoin
⎕IO←0
Essayez-le en ligne!
la source