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~#&
.Respostas:
JavaScript, 36 bytes
Modifica a matriz de entrada original.
Experimente online
fonte
Haskell, 56 bytes
Haskell e atualizações no local são uma má combinação.
Experimente online!
fonte
Python 2 , 53 bytes
Experimente online!
-6 graças ao HyperNeutrino .
Altera
l
o resultado no local.fonte
C ++ 14 (gcc) , 61 bytes
Como lambda genérico sem nome. Requer recipientes seqüenciais como
std::vector
.Experimente online!
fonte
Rápido ,
6853 bytesExperimente online!
-15 graças ao BMO
fonte
f=
). Aproveite a sua estadia aqui!map
vez deforEach
reduzi-lo?JavaScript (ES6), 41 bytes
Experimente online!
fonte
05AB1E (herdado) , 8 bytes
Experimente online!
Explicação
05AB1E , 14 bytes
Experimente online!
fonte
Japonês,
15137 bytesModifica a matriz de entrada original.
Experimente (bytes adicionais são para gravar a entrada modificada no console)
fonte
Java 8,
10554 bytesModifica a matriz de entrada em vez de retornar uma nova para salvar bytes.
Experimente online.
Explicação:
fonte
Japonês , 17 bytes
Experimente todos os casos de teste
Parece que deveria ser mais curto, mas infelizmente meu pensamento inicial
UmgU
não funciona porque cada umg
acessa o original emU
vez de modificá-lo a cada passo. Preservar diferentes componentes também custa um punhado de bytes.Explicação:
fonte
C (clang) , 32 bits,
4944 bytesExperimente online!
Usa ponteiros.
5045 bytes com números inteiros:Experimente online!
fonte
Ruby ,
3734 bytesExperimente online!
Retorna modificando a matriz de entrada no local.
fonte
Vermelho , 63 bytes
Experimente online!
Modifica a matriz no local
fonte
R ,
6058 bytes-2 bytes graças a @digEmAll por ler as regras.
Experimente online!
1 indexado.
n
é o comprimento da matriz de entrada.rep(1:n,n)
replica1:n
n
vezes (por exemplon=3 => 1,2,3,1,2,3,1,2,3
)Repetir os
n
tempos da matriz . O estado estacionário será alcançado até então, com certeza, de fato até o final da n-1ª vez, acho. Cabe ao leitor fornecer a prova.fonte
+1
e simplesmente pegar a entrada baseada em 1, o post afirma: Você pode optar por usar a indexação baseada em 1scan()
para entrada. Sempre sinto que minhasscan()
soluções não são ótimas, portanto, fique de olho em uma maneira mais curta de atribuirx
en
reunir:n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x
Experimente on-line!Lisp comum,
5958 bytesExperimente online!
fonte
Limpo , 80 bytes
Experimente online!
fonte
Clojure , 136 bytes
Experimente online!
fonte
loop [
não pode se tornarloop[
?Perl 5,
353426 bytesusando o fato de que a convergência é atingida no máximo para o número de iterações de tamanho
26 bytes
34 bytes
35 bytes
fonte
Clojure , 88 bytes
Experimente online!
fonte
Carvão , 16 bytes
Experimente online! Link é a versão detalhada do código. Infelizmente, todas as funções de mapeamento usuais operam apenas em uma cópia da matriz, com o resultado de que elas apenas permutam os elementos em vez de saltá-los, portanto o código precisa fazer tudo manualmente. Explicação:
Repita o loop interno uma vez para cada elemento. Isso apenas garante que o resultado se estabilize.
Faça um loop sobre os índices da matriz.
Obtenha o elemento da matriz no índice atual, use-o para indexar na matriz e substitua o elemento atual por esse valor.
Transmitir os elementos para string e imprimir implicitamente cada um em sua própria linha.
fonte
F #,
7473 bytesNada especial. Usa a ideia do módulo vista em outras respostas.
fonte
K, 27 bytes
{..}/
aplica lambda {..} sobre arg (até convergência)dentro lambda exterior:
{..}/[x;y]
aplica lambda iterativamente sobre x (atualizado a cada iteração) e um item de y (y é uma lista de valores e usa um item em cada iteração). Nesse caso, arg y é!#x
(até a contagem x, isto é, índices da matriz)@[x;y;:;x x y]
alterar matriz x (no índice y atribuir x [x [y]])fonte
APL (Dyalog Unicode) , SBCS de 26 bytes
Requer
⎕IO←0
Experimente online!
fonte