Припустимо, у нас є масив довжини із вказівниками, що вказують на якесь місце в масиві: Процес " стрибки вказівника " встановить кожен вказівник на місце, на яке вказує вказівник.
Для цієї задачі покажчик - це (нульовий) індекс елемента масиву, це означає, що кожен елемент масиву буде більшим або рівним і менше . За допомогою цього позначення процес можна сформулювати так:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Це означає (для цього виклику), що покажчики оновлюються на місці в послідовному порядку (тобто спочатку нижчі індекси).
Приклад
Давайте попрацюємо на прикладі :
Отже, після однієї ітерації « стрибка » ми отримуємо масив .
Виклик
Даний масив з індексами виводить масив, отриманий ітерацією вищеописаного покажчика, стрибаючи, поки масив більше не змінюється.
Правила
Ваша програма / функція буде приймати та повертати / виводити одного типу, список / вектор / масив тощо
- гарантовано є не порожнім і
- гарантовано містить лише записи .
Варіанти: Ви можете вибрати
- використовувати індексацію на основі 1 або
- використовувати фактичні покажчики,
однак слід зазначити це у своєму поданні.
Тестові кейси
[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
як додатковий вхід?
#[[#]]&~FixedPoint~#&
.