Supongamos que tenemos una matriz de longitud con punteros que apuntan a alguna ubicación en la matriz: el proceso de " salto de puntero " establecerá cada puntero en la ubicación a la que apunta.
Para el propósito de este desafío, un puntero es el índice (basado en cero) de un elemento de la matriz, esto implica que cada elemento de la matriz será mayor o igual a y menor que . Usando esta notación, el proceso puede formularse de la siguiente manera:
for i = 0..(n-1) {
ps[i] = ps[ps[i]]
}
Esto significa (para este desafío) que los punteros se actualizan in situ en orden secuencial (es decir, primero los índices más bajos).
Ejemplo
Analicemos un ejemplo, :
Entonces, después de una iteración de " salto de puntero " obtenemos la matriz .
Reto
Dada una matriz con salida de índices, la matriz obtenida iterando el puntero descrito anteriormente saltando hasta que la matriz ya no cambie.
Reglas
Su programa / función tomará y devolverá / generará el mismo tipo, una lista / vector / matriz, etc., que
- se garantiza que no está vacío y
- se garantiza que solo contiene entradas .
Variantes: puedes elegir
- utilizar indexación basada en 1 o
- usar punteros reales,
Sin embargo, debe mencionar esto en su presentación.
Casos de prueba
[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~#&
.Respuestas:
JavaScript, 36 bytes
Modifica la matriz de entrada original.
Pruébalo en línea
fuente
Haskell, 56 bytes
Haskell y las actualizaciones en el lugar son una mala combinación.
Pruébalo en línea!
fuente
Python 2 , 53 bytes
Pruébalo en línea!
-6 gracias a HyperNeutrino .
Altera
l
el resultado en su lugar.fuente
C ++ 14 (gcc) , 61 bytes
Como lambda genérico sin nombre. Requiere contenedores secuenciales como
std::vector
.Pruébalo en línea!
fuente
Swift ,
6853 bytesPruébalo en línea!
-15 gracias a BMO
fuente
f=
). ¡Disfruta tu estadía aquí!map
lugar deforEach
hacerlo más corto?JavaScript (ES6), 41 bytes
Pruébalo en línea!
fuente
05AB1E (heredado) , 8 bytes
Pruébalo en línea!
Explicación
05AB1E , 14 bytes
Pruébalo en línea!
fuente
Japt,
15137 bytesModifica la matriz de entrada original.
Pruébelo (los bytes adicionales son para escribir la entrada modificada en la consola)
fuente
Java 8,
10554 bytesModifica la matriz de entrada en lugar de devolver una nueva para guardar bytes.
Pruébalo en línea.
Explicación:
fuente
Japt , 17 bytes
Pruebe todos los casos de prueba
Parece que debería ser más corto, pero desafortunadamente mi pensamiento inicial
UmgU
no funciona porque cada unog
accede al original enU
lugar de modificarlo en cada paso. La preservación de diferentes componentes también cuesta un puñado de bytes.Explicación:
fuente
C (clang) , 32 bits,
4944 bytesPruébalo en línea!
Utiliza punteros.
5045 bytes con enteros:Pruébalo en línea!
fuente
Ruby ,
3734 bytesPruébalo en línea!
Devuelve modificando la matriz de entrada en el lugar.
fuente
Rojo , 63 bytes
Pruébalo en línea!
Modifica la matriz en su lugar.
fuente
R ,
6058 bytes-2 bytes gracias a @digEmAll por leer las reglas.
Pruébalo en línea!
1 indexado.
n
es la longitud de la matriz de entrada.rep(1:n,n)
replica los1:n
n
tiempos (pn=3 => 1,2,3,1,2,3,1,2,3
. ej. )Recorre los
n
tiempos de la matriz . El estado estable se alcanzará para entonces con seguridad, de hecho, al final de la n-1ra vez, creo. La prueba se deja para el lector.fuente
+1
y simplemente tomar la entrada basada en 1, la publicación dice: Puede optar por usar la indexación basada en 1scan()
para entrada. Siempre siento que misscan()
soluciones son subóptimas, así que esté atento a una forma más corta de asignarx
yn
juntos: ¡n=length(x<-scan());for(i in rep(1:n,n))x[i]=x[x[i]];x
Pruébelo en línea!Lisp común,
5958 bytesPruébalo en línea!
fuente
Limpio , 80 bytes
Pruébalo en línea!
fuente
Clojure , 136 bytes
Pruébalo en línea!
fuente
loop [
no puede convertirseloop[
?Perl 5,
353426 bytesusando el hecho de que la convergencia es alcanzar como máximo el número de iteraciones
26 bytes
34 bytes
35 bytes
fuente
Clojure , 88 bytes
Pruébalo en línea!
fuente
Carbón , 16 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Lamentablemente, todas las funciones de mapeo habituales solo funcionan en una copia de la matriz con el resultado de que simplemente permutan los elementos en lugar de saltarlos, por lo que el código tiene que hacer todo manualmente. Explicación:
Repita el bucle interno una vez para cada elemento. Esto solo asegura que el resultado se estabilice.
Recorrer los índices de la matriz.
Obtenga el elemento de matriz en el índice actual, úselo para indexar en la matriz y reemplace el elemento actual con ese valor.
Convierta los elementos en cadenas e imprima implícitamente cada uno en su propia línea.
fuente
F #,
7473 bytesNada especial. Utiliza la idea de módulo vista en otras respuestas.
fuente
K, 27 bytes
{..}/
aplica lambda {..} sobre arg (hasta la convergencia)interior lambda exterior:
{..}/[x;y]
aplica lambda iterativamente sobre x (actualizado en cada iteración) y un elemento de y (y es una lista de valores, y utiliza un elemento en cada iteración). En este caso, arg y es!#x
(hasta contar x, es decir, índices de la matriz)@[x;y;:;x x y]
modificar matriz x (en el índice y asignar x [x [y]])fuente
APL (Dyalog Unicode) , SBCS de 26 bytes
Requiere
⎕IO←0
Pruébalo en línea!
fuente