Załóżmy, że mamy tablicę o długości ze wskaźnikami wskazującymi na pewne miejsce w tablicy: proces „ przeskakiwania wskaźnika ” ustawi każdy wskaźnik na lokalizację wskaźnika, na który wskazuje.
Dla celów tego wyzwania wskaźnikiem jest (liczony od zera) indeks elementu tablicy, co oznacza, że każdy element w tablicy będzie większy lub równy i mniejszy niż . Za pomocą tej notacji proces można sformułować w następujący sposób:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Oznacza to (dla tego wyzwania), że wskaźniki są aktualizowane na miejscu w kolejności sekwencyjnej (tj. Najpierw niższe wskaźniki).
Przykład
Przeanalizujmy przykład: :
Zatem po jednej iteracji „ przeskakiwania wskaźnika ” otrzymujemy tablicę .
Wyzwanie
Biorąc pod uwagę tablicę z wyjściowymi indeksami, tablica uzyskana przez iterację opisanego powyżej przeskakiwania wskaźnika, aż tablica się już nie zmieni.
Zasady
Twój program / funkcja pobierze i zwróci / wyśle ten sam typ, listę / wektor / tablicę itp., Które
- gwarantuje się, że będzie niepusty i
- na pewno zawiera tylko wpisy .
Warianty: możesz wybrać
- użyć indeksowania 1 lub
- używaj rzeczywistych wskaźników,
należy jednak wspomnieć o tym w zgłoszeniu.
Przypadki testowe
[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
jako dodatkowy wkład?
#[[#]]&~FixedPoint~#&
.