Recientemente tuve un problema que resolver en el trabajo donde tenía dos listas: una lista maestra y una lista más pequeña que contiene un subconjunto de los elementos de la lista maestra potencialmente en un orden diferente. Necesitaba reordenar la lista maestra de tal manera que los elementos del subconjunto aparecieran en el mismo orden sin cambiar el orden de los elementos que no se encuentran en la lista y mantener los elementos en la misma ubicación siempre que sea posible. De acuerdo, eso probablemente suene confuso, así que lo desglosaré:
- La lista maestra define el orden predeterminado de los elementos.
- La lista de subconjuntos define el orden relativo de ciertos elementos.
- Cuando la lista maestra tiene dos elementos desordenados de acuerdo con la lista de subconjuntos, el elemento que está más temprano en la lista maestra debe moverse al índice más temprano donde se encuentra en la ubicación correcta en relación con otros elementos dentro de la lista de subconjuntos. (es decir, inmediatamente después del artículo posterior)
Su tarea es implementar este algoritmo de reordenamiento.
Ejemplos de casos de prueba
Master: [1, 2, 3]
Subset: []
Result: [1, 2, 3]
Master: [9001, 42, 69, 1337, 420]
Subset: [69]
Result: [9001, 42, 69, 1337, 420]
Master: [9001, 42, 69, 1337, 420, 99, 255]
Subset: [69, 9001, 1337]
Result: [42, 69, 9001, 1337, 420, 99, 255]
Master: [1, 2, 3, 4, 5]
Subset: [2, 5]
Result: [1, 2, 3, 4, 5]
Master: [apple, banana, carrot, duck, elephant]
Subset: [duck, apple]
Result: [banana, carrot, duck, apple, elephant]
Master: [Alice, Betty, Carol, Debbie, Elaine, Felicia, Georgia, Helen, Ilene, Julia]
Subset: [Betty, Felicia, Carol, Julia]
Result: [Alice, Betty, Debbie, Elaine, Felicia, Carol, Georgia, Helen, Ilene, Julia]
Master: [snake, lizard, frog, werewolf, vulture, dog, human]
Subset: [snake, werewolf, lizard, human, dog]
Result: [snake, frog, werewolf, lizard, vulture, human, dog]
Master: [Pete, Rob, Jeff, Stan, Chris, Doug, Reggie, Paul, Alex]
Subset: [Jeff, Stan, Pete, Paul]
Result: [Rob, Jeff, Stan, Pete, Chris, Doug, Reggie, Paul, Alex]
Master: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Subset: [8, 1, 2, 12, 11, 10]
Result: [3, 4, 5, 6, 7, 8, 1, 2, 9, 12, 11, 10]
Master: [lol, rofl, lmao, roflmao, lqtm, smh, jk, wat]
Subset: [wat, lmao, rofl]
Result: [lol, roflmao, lqtm, smh, jk, wat, lmao, rofl]
Reglas
- Lagunas estándar, yadda yadda, E / S conveniente, bla, bla.
- Aunque los ejemplos usan números y cadenas, solo necesita admitir un tipo de elemento, ya sean enteros, cadenas o cualquier otra cosa con una semántica de igualdad bien definida, incluidas listas heterogéneas si es conveniente en su idioma.
- Puede suponer que tanto la lista maestra como la lista de subconjuntos no contienen duplicados
- Puede suponer que todos los elementos encontrados en la lista de subconjuntos se encuentran en la lista maestra
- Cualquiera de las listas puede estar vacía
- Debe, como mínimo, admitir matrices de hasta 100 elementos de largo.
- El reordenamiento puede implementarse en el lugar o mediante la creación de una nueva lista / matriz.
¡Feliz golf!
code-golf
array-manipulation
Carne de res
fuente
fuente
8 1 3 4 5 6 7 2 9 12 11 10
una solución válida para el penúltimo?Respuestas:
Retina 0.8.2 , 51 bytes
Pruébalo en línea! Toma datos como una lista de subpalabras separadas por comas en la primera línea y una lista maestra de palabras separadas por comas en la segunda línea. Explicación:
Encuentre dos subpalabras adyacentes donde la segunda palabra precede a la primera en la lista maestra.
Mueva la segunda palabra para que aparezca después de la primera palabra en la lista maestra.
Repita hasta que no aparezcan palabras fuera de orden.
Eliminar las subpalabras.
fuente
JavaScript (ES6),
96 89 7471 bytesEsto comenzó como un desastre voluminoso y finalmente se redujo a una forma bastante concisa y elegante. Me gustaría agradecer a los método .splice () por su fructífera colaboración en ese sentido. ;)
Toma entrada como
(master)(subset)
. Salidas actualizando la lista maestra.Pruébalo en línea!
¿Cómo?
Comentado
fuente
Haskell, 79 bytes
Pruébalo en línea!
fuente
rubí ,
7368 bytesPruébalo en línea!
¿Cómo?
a
yb
contiene todos los elementos deb
, pero en el mismo orden en que los encontraríamos ena
b
y en la intersección en paralelo, tan pronto como encontremos una diferencia, podemos reubicar un solo elemento.a
la posición del elemento que encontramos enb
, luego eliminando el elemento que encontramos en la intersección y luego agregando el resto de a.b
estén en el orden correcto ena
fuente
0while
?Python 2 ,
1241091069996 bytesPruébalo en línea!
fuente
Perl 6 , 40 bytes
Pruébalo en línea!
Bloque de código anónimo que toma la entrada al curry (como
f(subList)(masterList)
, y encuentra la primera permutación lexográfica de los índices de la lista maestra donde los elementos de la sublista están en el orden correcto.Intuitivamente, la primera permutación satisfactoria dejará los elementos correctamente ordenados en el orden original, mientras mueve a los incorrectamente colocados la distancia mínima necesaria hacia adelante para tenerlos en el orden correcto, que los coloca directamente después del elemento anterior en el subconjunto.
Explicación:
fuente
Jalea , 9 bytes
Pruébalo en línea! o conjunto de pruebas
Ineficiente, particularmente con grandes listas maestras. Genera todas las permutaciones posibles, filtra aquellas en las que el subconjunto está en el orden incorrecto y luego devuelve el primero.
Explicación
fuente
J , 49 bytes
Pruébalo en línea!
explicación
Tomamos el subconjunto como el argumento izquierdo y la entrada completa como el derecho.
Trabajaremos a través del código con un ejemplo específico para mayor claridad:
Tome los infijos en caja de tamaño dos del subconjunto:
productor:
agréguelos a la entrada original e invierta todo:
Obtenemos:
Resolver el problema se convierte en una reducción de derecha a izquierda en lo anterior. Solo necesitamos encontrar el verbo correcto para insertar
/
entre los elementos.Cada iteración de la reducción actualizará el cuadro de la derecha (la entrada completa, que estamos transformando) para que se ajuste a la restricción de ordenamiento representada por el par a su izquierda. Cuando finaliza la reducción, la entrada respetará el orden completo del subconjunto.
Si el orden del par es el mismo que el pedido en la entrada, lo siguiente se evaluará a 0 y no haremos nada:
De lo contrario, se evaluará a 1 y aplicaremos el verbo a la izquierda de
^:
que mueve el elemento izquierdo a la derecha del elemento derecho. Este movimiento es simplemente una permutación cíclica. de todos los elementos entre (e incluyendo) los dos elementos en cuestión.
J tiene primitivo para aplicar una permutación cíclica de este tipo:
y el resto del verbo no hace más que seleccionar los índices que necesitamos para completar el ciclo:
que parece más largo de lo que debería ser, pero no pude seguir esa frase.
Finalmente volvemos a encajonar el resultado
<@
y terminamos.fuente
Jalea , 24 bytes
Pruébalo en línea! oconjunto de pruebas
Explicación
Un enlace diádico que toma el subconjunto como la izquierda y la lista maestra como argumentos correctos. El siguiente ejemplo utiliza 9001, 42, 69, 1337, 420, 99, 255 como maestro y 69, 9001, 1337 como subconjunto.
fuente
C # (compilador interactivo de Visual C #) , 118 bytes
Pruébalo en línea!
Aprovechando algunas clases en el
System.Collections.Generic
espacio de nombres. El maestro es aList<T>
y el subconjunto es aQueue<T>
.fuente