Objetivo
Genere la lista codificada original, a partir de los movimientos que haría una Clasificación de inserción para ordenarla. La lista original tendrá todos los números desde 0
hasta N-1
(inclusive) donde N
está el tamaño de la entrada.
Entrada
Una lista que contiene los movimientos necesarios para ordenar la lista. Cada valor representa la cantidad de ranuras desplazadas por el número original (codificado) para estar en su posición correcta, tenga en cuenta que este proceso es de izquierda a derecha.
El valor en la posición (indexada a 0) i
en la lista de entrada estará entre 0
e i
inclusive.
No necesita manejar entradas inválidas, cualquier comportamiento es aceptable en este caso (bloqueo, bucle infinito, etc.).
Salida
La lista revuelta
Paso a paso para generar los movimientos.
Scrambled List | Moves to sort
[4,0,2,1,3,5] | [0, , , , , ] #4 stay in place
[4,0,2,1,3,5] | [0,1, , , , ] #0 is moved 1 slot to the left
[0,4,2,1,3,5] | [0,1,1, , , ] #2 is moved 1 slot
[0,2,4,1,3,5] | [0,1,1,2, , ] #1 is moved 2 slot
[0,1,2,4,3,5] | [0,1,1,2,1, ] #3 is moved 1 slot
[0,1,2,3,4,5] | [0,1,1,2,1,0] #5 is in the right place already
[0,1,2,3,4,5]
Entonces, para la entrada, [0,1,1,2,1,0]
su programa necesita salir [4,0,2,1,3,5]
.
Tenga en cuenta que los movimientos no están en la posición en la lista ordenada (final), sino en el segmento ordenado (la sección en negrita)
Casos de prueba
[0,0,0] -> [0,1,2]
[0,1,0,1] -> [1,0,3,2]
[0,0,0,0,0,5] -> [1,2,3,4,5,0]
[0,1,2,3] -> [3,2,1,0]
[0,1,1,1] -> [3,0,1,2]
[0,1,1,2,1,0] -> [4,0,2,1,3,5]
Victorioso
Este es el código de golf , por lo que gana la respuesta más corta.
fuente
Respuestas:
Jalea , 12 bytes
Pruébalo en línea!
Explicación
Básicamente, podemos ver las dos listas (la entrada y la salida) como codificación de un número entero; la entrada codifica un número entero en base factorial, y la salida codifica un número entero como permutación. Afortunadamente, Jelly tiene incorporados que ya están muy cerca de ambas codificaciones, por lo que es simplemente una cuestión de escribir pequeños trozos de código para convertirlos en un entero y luego volver a la otra codificación.
En el caso del factorial base, podemos observar que el primer elemento de la lista debe ser 0, el segundo puede ser 0 o 1, el tercero debe ser 0/1/2, y así sucesivamente. Por lo tanto, tenemos que invertir la entrada para obtener sus elementos en el orden de escritura normal para la conversión de base.
Además, para que los órdenes relativos de la conversión factorial y la conversión de permutación coincidan con la operación que utiliza la ordenación por inserción, debemos hacer dos ajustes: invertir la secuencia de las permutaciones e invertir el orden de la lista de salida. Revertir la lista de resultados es bastante fácil, ya que solo necesita un
U
al final del programa. Para invertir la secuencia de permutaciones, restamos del factorial de la longitud de entrada (esto funciona porque el factorial base produce un número en el rango de 0 a (longitud! -1), mientras que las permutaciones están numeradas por Jelly de 1 a longitud! , produciendo un off-by-one implícito que cancela el off-by-one que normalmente se obtiene al restar un índice de permutación de un factorial).Jelly , 9 bytes, en colaboración con @JonathanAllan
Esta versión del programa es muy similar, pero utiliza un método diferente para revertir la secuencia de permutaciones; simplemente negar la entrada con
N
es suficiente para hacer queœ?
el orden se trate en reversa. Aparte de eso, funciona de manera idéntica al programa anterior.Pruébalo en línea!
fuente
Æ¡
y yoœ?
funcionarían para esto (ya había comenzado a tratar de usarlos para este desafío antes, estaba tan cerca, solo necesitaba elL!
allí).UÆ¡Nœ?L’U
porque implement�
(y similares) para actuar de forma modular (como si estuvieran usando listas Jelly). ElN
justo se indexa con el valor negativo. Nota: CambiéJ
aL
: esto es solo porque, dado un número, de todos modos hace un rango bajo el capó).Mathematica, 92 bytes
Función pura que toma una lista de enteros no negativos como entrada y devuelve una lista de enteros no negativos. El código anterior contiene un
©
, que es incorrecto: es un marcador de posición para el símbolo de 3 bytes U + F3DE, que Mathematica representa por un círculo con un punto en él, y que representa la composición de las permutaciones.c=Cycles@{#}&
define una función que convierte una lista de enteros en unCycles
objeto que representa una permutación; por ejemplo,c[{3,4}]
son los elementos de intercambio de transposición 3 y 4 de una lista.c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]
toma la lista de entrada y genera las permutaciones necesarias para deshacer el orden de inserción. Luegoc@{}©##&@@
compone todas estas permutaciones juntas, comenzando con la permutación de identidadc@{}
. Finalmente,Permute[Range[l=Length@#]-1,...]
aplica esta permutación a la lista indexada 0 de longitud apropiada.fuente
@{#}&)@{}©##&@@
da miedo.Python 2,
7968 bytesGracias a Krazor por guardar 10 bytes.
Gracias a TuukkaX por guardar 1 byte
Funciona generando los movimientos en reversa
fuente
a=input();b=range(len(a));print[b.pop(j-a[j]) for j in b[::-1]][::-1]
. Lista de comprensiones ftw!for
, así que supongo que 65 supongo: DJavaScript (ES6),
696563 bytesMolestamente, tanto la entrada como la salida están en el orden incorrecto. Editar: Guardado 4 bytes gracias a @Arnauld. Guardado 2 bytes gracias a @ETHproductions.
fuente
i
, ¿verdad?i
...o=>+b.splice(~o,1)
JavaScript (ES6),
7371 bytesAhorró 2 bytes gracias a ETHproductions
Casos de prueba
Mostrar fragmento de código
fuente
a=m.map(_=>j++,j=0)
, pero esa es la misma longitud y estoy seguro de que ya lo has probado.j
ena.length
lugar dea.length-1
y requeriríaa.splice(--j,0,a.splice(j-m[j],1)[0])
)+a.splice(j-m[j--],1)
Haskell , 85 bytes
Pruébalo en línea! Ejemplo de uso:
f [0,1,1,2,1,0]
rendimientos[4,0,2,1,3,5]
.f x
llama a la función#
con la listax
invertida y una lista[length x - 1, length x - 2, ... , 0]
.(n:r)#l
realiza la ordenación de inserción inversa sacando recursivamente eln
elemento thl
, dondel!!n
produce eln
elemento th ytake n l++drop(n+1)l
la listal
con eln
elemento th eliminado.fuente
perl, 61 bytes
La salida termina en matriz @o. Ejemplo con matriz de entrada como argumentos de línea de comando:
fuente
Ruby, 49 bytes
Realiza la "inserción inversa" en su lugar dentro de la lista, comenzando con el número más grande.
fuente