Suponha que tenhamos uma matriz de comprimento com ponteiros apontando para algum local da matriz: O processo de " salto do ponteiro " definirá cada ponteiro para o local em que o ponteiro aponta.
Para o objetivo desse desafio, um ponteiro é o índice (com base em zero) de um elemento da matriz, isso implica que todos os elementos na matriz serão maiores ou iguais a e menores que . Usando esta notação, o processo pode ser formulado da seguinte maneira:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Isso significa (para esse desafio) que os ponteiros são atualizados no local em ordem sequencial (ou seja, índices mais baixos primeiro).
Exemplo
Vamos trabalhar com um exemplo, :
Então, após uma iteração de " ponteiro pulando ", obtemos a matriz .
Desafio
Dada uma matriz com índices, a matriz obtida iterando o ponteiro descrito acima pulando até que a matriz não mude mais.
Regras
Seu programa / função pegará e retornará / produzirá o mesmo tipo, uma lista / vetor / matriz etc. que
- é garantido para ser não vazio e
- é garantido que contenha apenas as entradas .
Variantes: você pode escolher
- usar indexação baseada em 1 ou
- use ponteiros reais,
no entanto, você deve mencionar isso em sua submissão.
Casos de teste
[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
como entrada adicional?
#[[#]]&~FixedPoint~#&
.