Angenommen , wir haben eine Reihe der Länge mit Zeigern zeigt auf einer Stelle im Array: Der Prozess der „ Zeiger Springen “ wird alle Zeiger auf die Position des Zeigers gesetzt verweist er auf Punkte.
Für die Zwecke dieser Abfrage ist ein Zeiger der (auf Null basierende) Index eines Elements des Arrays. Dies impliziert, dass jedes Element im Array größer oder gleich und kleiner als . Unter Verwendung dieser Notation kann der Prozess wie folgt formuliert werden:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Dies bedeutet (für diese Herausforderung), dass die Zeiger in sequentieller Reihenfolge an Ort und Stelle aktualisiert werden (dh zuerst niedrigere Indizes).
Beispiel
Lassen Sie uns ein Beispiel , ps = [2,1,4,1,3,2] :
Nach einer Iteration des " Zeigerspringens " erhalten wir das Array .
Herausforderung
Bei einem Array mit Indizes wird das Array ausgegeben, das durch Iterieren des oben beschriebenen Zeigersprungs erhalten wird, bis sich das Array nicht mehr ändert.
Regeln
Ihr Programm / Ihre Funktion wird denselben Typ, eine Liste / einen Vektor / ein Array usw. annehmen und zurückgeben / ausgeben, die / das
- ist garantiert nicht leer und
- enthält garantiert nur Einträge .
Varianten: Sie können wählen
- 1-basierte Indizierung verwenden oder
- Verwenden Sie aktuelle Zeiger,
Sie sollten dies jedoch in Ihrem Beitrag erwähnen.
Testfälle
[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
als zusätzliche Eingabe verwenden?
#[[#]]&~FixedPoint~#&
.