Dada una lista de índices y cero o más listas de enteros, genera las listas de enteros, ordenadas en orden ascendente, con la prioridad clave desde la primera entrada.
Ejemplo
Deje que la entrada de teclas sea [1, 0, 2]
y la entrada de listas sea [[5, 3, 4], [6, 2, 1], [5, 2, 1]]
. Esas listas deben ordenarse por su segundo elemento, luego el primer elemento, luego el tercer elemento, en orden ascendente:
- Primero, ordenamos por los valores en el índice
1
:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
- A continuación, rompemos los lazos del primer orden usando los valores en el índice
0
:[[5, 2, 1], [6, 2, 1], [5, 3, 4]]
- Finalmente, rompemos cualquier vínculo restante con los valores en el índice
2
(esto en realidad no cambia nada, porque no quedan vínculos).
Detalles
- La ordenación es estable: si dos elementos se comparan iguales con respecto a las claves de ordenación dadas, deben permanecer en el mismo orden relativo en la salida. Por ejemplo, si
A
yB
son iguales bajo las teclas de clasificación dadas, y la entrada era[..., A, ..., B, ...]
,A
debe colocarse antesB
en la salida. - Una clave de clasificación nunca hará referencia a un elemento no existente en una de las listas de entrada.
- No se repetirá ninguna clave de clasificación. Por lo tanto,
[1, 2, 1]
no es una lista válida de claves de clasificación. - Los elementos a los que no hacen referencia las claves de clasificación no tienen en cuenta el orden de clasificación. Solo el orden relativo inicial y los valores de los elementos a los que hacen referencia las claves de clasificación determinan el orden de salida.
- Puede elegir si las claves de clasificación están indexadas a cero o indexadas a una.
- No habrá valores negativos en las claves de clasificación. Si elige usar una indexación, tampoco habrá ceros en las claves de clasificación.
- Los valores enteros no excederán el rango de representación nativa de su idioma. Si el idioma elegido es nativamente capaz de enteros de precisión arbitraria (como Python), entonces cualquier valor entero puede estar presente en la entrada, sujeto a restricciones de memoria.
Implementación de referencia (Python 2)
#!/usr/bin/env python
keys = input()
lists = input()
print sorted(lists, key=lambda l:[l[x] for x in keys])
Casos de prueba
Formato: keys lists -> output
. Todas las claves de clasificación están indexadas a cero.
[1, 0, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[5, 2, 1], [6, 2, 1], [5, 3, 4]]
[1, 2] [[5, 3, 4], [6, 2, 1], [5, 2, 1]] -> [[6, 2, 1], [5, 2, 1], [5, 3, 4]]
[0, 1] [[1, 2], [2, 1]] -> [[1, 2], [2, 1]]
[1, 0] [[1, 2], [2, 1]] -> [[2, 1], [1, 2]]
[0] [[4], [10, 11, -88], [-2, 7]] -> [[-2, 7], [4], [10, 11, -88]]
[2] [[-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6]] -> [[-9, 8, -5, -1, -7, -8, -5, -6, 5, -6, 6], [-7, 6, 2, -8, -7, 7, -3, 3, 0, -6, 1], [-1, -5, 8, -1, -4, -10, -5, 4, 4, 6, -8, 4, 2]]
[2, 1] [[9, 2, -2, -10, -6], [3, -4, -2]] -> [[3, -4, -2], [9, 2, -2, -10, -6]]
[2, 4, 8] [[5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5], [-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3]] -> [[-7, -8, -6, 7, 3, 8, 6, -7, -2, 0, -6, -4, 4, -3, 2, -3], [5, -3, 4, -6, -1, -2, -2, -4, 5], [-2, -3, 6, -4, -1, -4, -4, -5, 8, 9, 9, -3, 3, -9, -3], [2, 0, 10, -10, -1, 2, -1, 5, -1, 10, -5]]
[1, 2, 3, 4, 5] [[-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [5, 3, -6, -5, -4, -4, -8, 2], [9, -4, 1, -1, -3, -2], [-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [1, -5, -3, -10, -7, 9, -8, -5, -1], [-9, 4, -1, -1, 2, 4]] -> [[-6, -10, 4, -10, 6, 6, -1, 3, 0, 0], [1, -5, -3, -10, -7, 9, -8, -5, -1], [9, -4, 1, -1, -3, -2], [1, -2, -7, -6, -7, -7, -1, 0, -4, 3, 3], [-9, -1, -7, -9, -10, -2, -8, -10, -10, -3], [7, -1, -7, 2, -2, 9, 7, 5, -6, -8], [-7, 3, -8, 3, 5, -1, 6, -6, 9, 8], [5, 3, -6, -5, -4, -4, -8, 2], [-9, 4, -1, -1, 2, 4]]
[8, 7, 3, 2, 4, 9, 1] [[8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9]] -> [[10, -1, 3, 0, -4, 1, -5, -4, -1, -7, 9, -9, -1, -5, 7, 8, 9, 6, -3], [5, 6, -9, 0, -1, 5, 4, 7, 5, 10, 2, 5, 7, -9], [0, -9, -7, -2, 2, -5, 7, 4, 6, -4, 1, 8, -7, 10], [4, -8, 6, -10, -2, -3, 2, -6, 9, 5, 4, 10, 2, 3], [8, -5, 1, -6, -1, -4, 6, 10, 10, 6, 9, 5]]
Respuestas:
Jalea , 4 bytes
Pruébalo en línea!
fuente
Þ
es "ordenar con la clave de clasificación especificada",⁴ị
utiliza el segundo argumento de la línea de comandos para reordenar la matriz (produciendo una clave de clasificación que funciona como la pregunta), y$
anula la precedencia para que el programa se analice correctamente.CJam , 13 bytes
Un bloque sin nombre que espera la lista de listas y la lista de prioridades en la parte superior de la pila y las reemplaza con la lista ordenada de listas.
Pruébalo en línea! (Como un conjunto de pruebas).
Explicación
La clasificación con desempates se puede implementar ordenando repetidamente toda la lista estable pasando de la clave de prioridad más baja a la clave de prioridad más alta.
fuente
Ruby, 35 bytes
Véalo en eval.in: https://eval.in/652574
fuente
Haskell, 38 bytes
Ejemplo de uso:
( sortOn.flip(map.(!!)) ) [2,1] [[9,2,-2,-10,-6], [3,-4,-2]]
->[[3,-4,-2],[9,2,-2,-10,-6]]
.No pointfree:
f k v=sortOn(\x->map(\y->x!!y)k)v
.fuente
Mathematica,
2219 bytesUtiliza índices basados en 1. Esta función sin nombre es curry , por lo que la convención de llamada es:
Mathematica
SortBy
puede tomar una lista de funciones, en cuyo caso las funciones individuales se usan como sucesivos desempates, así que eso es justo lo que queremos. Todo lo que necesitamos hacer es crear una lista de funciones que devuelvan el elemento de lista correspondiente. Esto se puede hacer conExtract
.Extract
es normalmente una función binariaExtract[list, index]
que devuelve un elemento de lista. Sin embargo, si se usa de forma unívoca,Extract[index]
devuelve una función que recupera el elemento enindex
una lista que se le pasa. En otras palabras, elindex
parámetro deExtract
puede ser curry. Hacemos uso de esto mediante el mapeoExtract
sobre la lista de índices que se nos da, lo que crea la lista de funciones que necesitamos.fuente
Extract/@#
serExtract/@(#+1)
? El índice de la entrada comienza en 0.[{1, 0, 2}]
estar[{2, 1, 3}]
en su ejemplo? De hecho, actualmente parece estar ordenando por primer elemento, luego cabeza, luego segundo elemento.Python, 50 bytes
Esta es una versión trivialmente desarrollada de la implementación de referencia.
l
es el parámetro de listas, yk
es el parámetro de ordenar claves.l
puede ser cualquier iterable, siempre que sus elementos sean subscriptables por enteros (como listas, tuplas o dictos con clave int).k
Puede ser cualquier iterable.fuente
Brachylog , 29 bytes
Pruébalo en línea!
Explicación
Utilizamos el hecho de que
o - Order
se puede usar con un predicado adicional como entrada: ordenamos las listas usando para cada una[Keys, a list]
la lista de los elementosa list
que están en el índicea key
en el orden en que aparecenKeys
.fuente
CJam (12 bytes)
Demostración en línea . Este es un bloque anónimo (función) que toma los argumentos en el orden dado para los casos de prueba y deja el valor ordenado en la pila. Se basa en el tipo incorporado
$
sea estable, pero el intérprete oficial lo garantiza.Disección
fuente
J, 6 bytes
Las claves están indexadas a cero. El LHS es la lista de claves y el RHS es una matriz de valores. Como J no admite matrices irregulares, cada matriz debe estar encuadrada.
Uso
Explicación
fuente
JavaScript (ES6), 55 bytes
El estándar ECMAscript no garantiza que el tipo subyacente sea estable, por lo que el siguiente código de 68 bytes no hace esa suposición:
fuente
Pyth,
54 bytesPruébelo en línea: Demostración o conjunto de pruebas
Gracias a @Maltysen por un byte.
Explicación:
Me sorprendió mucho que esto funcionara. Es una sintaxis realmente extraña.
fuente
QE
porF
JavaScript (ES6) 46
En cada comparación durante la clasificación, escanee los índices clave para encontrar el orden correcto
Prueba
fuente
PHP,
212170 bytesPHP ya no tiene ningún tipo estable incorporado ; Al elegir una versión anterior, no hay forma de hacer una devolución de llamada recursiva con la especificación requerida. Pero no importa: usar el iterador de devolución de llamada recursivo costaría toneladas; así que ni siquiera verifiqué si eso podría hacerlo.
El bucle interno podría ser reemplazado por otro
foreach
; eso ahorraría algunos bytes en el intercambio. Pero sin un cheque para$b<$a
(o$b<count($i)
), eso dará como resultado un bucle infinito. Y con ese cheque, elforeach
costo tanto como el intercambio gana.Primero hice la comparación recursivamente; pero la iteración ahorra toneladas de bytes:
Descompostura
fuente
if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}
se puede escribir como$r>0&&$i[$b+1]^=$i[$b]^=$i[$b+1]^=$i[$b];
, ahorrándote 7 bytes. Esto utiliza un intercambio XOR con abuso de la evaluación de cortocircuito para emular unif(){ ... }
. El intercambio solo se ejecuta si y solo si$r>0
. Esto usa el mismo truco que (a veces) se usa con las bases de datos. A menudo, lo verásmysqli_connect( ... ) or die('Cannot connect');
.$b
bucle. ;)m($i,$k);
antes devar_dump
y Su versión producirá basura.R 40 bytes
Explicación:
La lista de listas se representa mejor como un marco de datos en R:
Si la lista de índice es il (la indexación es de 1):
La clasificación se puede hacer con el siguiente código:
Salida:
fuente
Perl 6
23 2019 bytesfuente
Raqueta 218 bytes
Sin golf (il = lista de índice; ll = lista de listas; qsl = clasificación rápida para la lista de listas; h = cabeza (primer elemento); t = cola (resto o elementos restantes); g = filtro modificable fn):
Pruebas:
Salida:
fuente
PHP, 139 bytes
usa el nuevo operador de nave espacial y usa
En lugar de
$x[$k[$i]]<=>$y[$k[$i]]
que pueda usar$x[$k[$i]]-$y[$k[$i]]
bajo una versión de PHP mayor de 7 a 2 bytesversión con crear un índice propio 197 Bytes como en una biblioteca real
fuente
<?function c($x,$y,$i=0){$k=$_GET[k];return $x[$k[$i]]<=>$y[$k[$i]]?:($k[++$i]?c($x,$y,$i):0);}usort($a=$_GET[a],c);echo json_encode($a);
.$_GET
es un superglobal: significa que ya es global en todas partes. Eliminaglobal$k;
, mueve la tarea dentro de la función y listo. Además, ya que esto está usando$_GET
, tienes que usar<?
. Con esto, ahorras 10 bytes. Funcionará (con suerte).sort
funciones de PHP usan quicksort; Eso no es estable. Aparte de eso, puede guardar dos bytes en-
lugar de<=>
y dos con una devolución de llamada anónima parausort
.c($x,$y,$i)
al final del cuerpo de la función.Clojure, 29 bytes
Nicely
sort-by
es estable y sabe cómo ordenar vectores, y los vectores pueden funcionar como funciones.([4 6 9 7] 2)
es9
(indexación basada en 0).fuente