Clasificación de teclas múltiples

20

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:

  1. Primero, ordenamos por los valores en el índice 1:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
  2. 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]]
  3. 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 Ay Bson iguales bajo las teclas de clasificación dadas, y la entrada era [..., A, ..., B, ...], Adebe colocarse antes Ben 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])

Pruébalo en línea

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]]
Mego
fuente
Algunos de los casos de prueba parecen odiosamente largos.
Fatalize
@Fatalize Están destinados a cubrir casos en los que hay pocas claves de clasificación en comparación con las longitudes de las listas, y casos en los que hay muchas claves de clasificación.
Mego
1
@Fatalize Es por eso que tenemos copiar y pegar. Si es necesario, use Retina para cambiar el formato a algo que pueda usar.
mbomb007
¿Podemos suponer que todas las filas tendrán la misma longitud si ese es el tipo de datos naturales en nuestro idioma (es decir, una matriz)?
Luis Mendo
@LuisMendo No. Debe poder admitir matrices irregulares.
Mego

Respuestas:

6

Jalea , 4 bytes

⁴ị$Þ

Pruébalo en línea!

Lynn
fuente
1
¿Tienes un desglose de cómo funciona?
JamEngulfer
@JamEngulfer: Debería haberse especificado en la respuesta, pero: Þ 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.
5

CJam , 13 bytes

{W%{{X=}$}fX}

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.

W%      e# Reverse priority list.
{       e# For each priority X...
  {     e#   Sort the lists by the result of this block...
    X=  e#     Extract the Xth element from the current list.
  }$
}fX
Martin Ender
fuente
4

Haskell, 38 bytes

import Data.List
sortOn.flip(map.(!!))

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.

nimi
fuente
4

Mathematica, 22 19 bytes

SortBy[Extract/@#]&

Utiliza índices basados ​​en 1. Esta función sin nombre es curry , por lo que la convención de llamada es:

SortBy[Extract/@#]&[{2, 1, 3}][{{5, 3, 4}, {6, 2, 1}, {5, 2, 1}}]

Mathematica SortBypuede 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 con Extract. Extractes normalmente una función binaria Extract[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 en indexuna lista que se le pasa. En otras palabras, el indexparámetro de Extractpuede ser curry. Hacemos uso de esto mediante el mapeo Extractsobre la lista de índices que se nos da, lo que crea la lista de funciones que necesitamos.

Martin Ender
fuente
No debe Extract/@#ser Extract/@(#+1)? El índice de la entrada comienza en 0.
JungHwan Min
2
@JHM "Puede elegir si las claves de clasificación están indexadas a cero o indexadas a una".
Martin Ender
Estoy corregido.
JungHwan Min
(Como era de esperar) elegante! Pero dado que está indexando 1, ¿no debería [{1, 0, 2}]estar [{2, 1, 3}]en su ejemplo? De hecho, actualmente parece estar ordenando por primer elemento, luego cabeza, luego segundo elemento.
Greg Martin
@ GregMartin lo siento, copiar / pegar falla.
Martin Ender
3

Python, 50 bytes

lambda l,k:sorted(l,key=lambda x:[x[y]for y in k])

Esta es una versión trivialmente desarrollada de la implementación de referencia. les el parámetro de listas, y kes el parámetro de ordenar claves. lpuede ser cualquier iterable, siempre que sus elementos sean subscriptables por enteros (como listas, tuplas o dictos con clave int). kPuede ser cualquier iterable.

Mego
fuente
3

Brachylog , 29 bytes

tT,?hg:Tz:{:2f}o:ta
heI,?t:Im

Pruébalo en línea!

Explicación

Utilizamos el hecho de que o - Orderse puede usar con un predicado adicional como entrada: ordenamos las listas usando para cada una [Keys, a list]la lista de los elementos a listque están en el índice a keyen el orden en que aparecen Keys.

                          Input = [Keys, List of lists]

tT,                       Call the Keys T
   ?hg:T                  Create the list [[T], List of lists]
        z                 Zip [T] with the list of lists
         :{   }o          Order by the output of this predicate
                :ta       Keep only the last element of each sublist in the Output

           :2f            Find all outputs of the predicate below

heI,                      Take a key I
    ?t:Im                 Output is the Ith element of the sublist
Fatalizar
fuente
3

CJam (12 bytes)

{{1$\f=}$\;}

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

{          e# Define a block. Stack: orders values-to-sort
  {        e#   Sort by...
    1$\f=  e#     Copy orders from the stack, and map array lookup
  }$
  \;       e#   Pop the orders to leave just sorted-values
}
Peter Taylor
fuente
3

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

   f =: ]/:{&>
   < 1 0 2
┌─────┐
│1 0 2│
└─────┘
   5 3 4 ; 6 2 1 ; 5 2 1
┌─────┬─────┬─────┐
│5 3 4│6 2 1│5 2 1│
└─────┴─────┴─────┘
   (< 1 0 2) f  5 3 4 ; 6 2 1 ; 5 2 1
┌─────┬─────┬─────┐
│5 2 1│6 2 1│5 3 4│
└─────┴─────┴─────┘
   (< 1 2) f  5 3 4 ; 6 2 1 ; 5 2 1
┌─────┬─────┬─────┐
│6 2 1│5 2 1│5 3 4│
└─────┴─────┴─────┘
   (< 0) f 4 ; 10 11 _88 ; _2 7
┌────┬─┬─────────┐
│_2 7│4│10 11 _88│
└────┴─┴─────────┘

Explicación

]/:{&>  Input: keys (LHS), values (RHS)
   {&>  Select from values at each index in keys
]       Get the values
 /:     Sort up the values using the ones selected with the keys
millas
fuente
2

JavaScript (ES6), 55 bytes

(k,l)=>k.reduceRight((l,i)=>l.sort((a,b)=>a[i]-b[i]),l)

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:

(k,l)=>l.sort(g=(a,b,i=0)=>i<k.length?a[k[i]]-b[k[i]]||g(a,b,i+1):0)
Neil
fuente
2

Pyth, 5 4 bytes

@LDF

Pruébelo en línea: Demostración o conjunto de pruebas

Gracias a @Maltysen por un byte.

Explicación:

@LDFQ   Q (=input) added implicitly. 
  D     sort a list of lists by
@L         the sublists generated by some indices
   FQ   executes ^ with the the input as parameter

Me sorprendió mucho que esto funcionara. Es una sintaxis realmente extraña.

Jakube
fuente
Creo que puedes ahorrar reemplazando QEporF
Maltysen
@ Maltysen Gracias. Pensé que eso solo era posible con un método regular de una ficha.
Jakube
1
Las reglas para el azúcar son muy ad hoc e inconsistentes, desafortunadamente lo mejor es probar si algo funciona.
Maltysen
2

JavaScript (ES6) 46

k=>l=>l.sort((a,b)=>k.some(i=>v=a[i]-b[i])&&v)

En cada comparación durante la clasificación, escanee los índices clave para encontrar el orden correcto

Prueba

f=k=>l=>l.sort((a,b)=>k.some(i=>v=a[i]-b[i])&&v)

;`[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]]`
.split('\n').map(row=>{
  var [keys,list,expected]=row.split(/] -?>? ?\[/)
  keys=eval(keys+']');
  list=eval('['+list+']');
  expected=eval('['+expected);
  var result=f(keys)(list);
  var ok=result.join`|`==expected.join`|`;
  console.log(ok?'OK':'KO',keys+' '+list.join`|`+' -> ' +expected.join`|`,ok?'':result.join`|`)
})

edc65
fuente
2

PHP, 212 170 bytes

function m(&$i,$k){foreach($i as$a=>$y)for($b=-1;++$b<$a;){for($p=0;$p<count($k)&!$r=$i[$b][$x=$k[$p++]]-$i[$b+1][$x];);if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}}}

PHP 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

// bubble sort
function m(&$i,$k)
{
    foreach($i as$a=>$y)
        for($b=-1;++$b<$a;)
        {
            // comparison:
            for($p=0;$p<count($k)                       // loop through keys
                &
                !$r=$i[$b][$x=$k[$p++]]-$i[$b+1][$x]    // while element equals its successor
            ;);
            // if element is larger than its successor, swap them
            if($r>0)
            {
                $s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;
            }
        }
}
Titus
fuente
Todo 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 un if(){ ... }. 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ás mysqli_connect( ... ) or die('Cannot connect');.
Ismael Miguel
El intercambio de @IsmaelMiguel XOR no funciona para matrices. Y ahorraría 10 bytes, porque podría convertirlo en la condición posterior del $bbucle. ;)
Titus
Probé el intercambio XOR y funcionó (no probé con el resto del código). Escribí 2 casos de prueba: sandbox.onlinephpfunctions.com/code/… (usted codifica) y sandbox.onlinephpfunctions.com/code/… (intercambio XOR). De acuerdo con text-compare.com , la salida es idéntica.
Ismael Miguel el
@IsmaelMiguel Para probar la función Debe ejecutarla: inserte m($i,$k);antes de var_dumpy Su versión producirá basura.
Titus
: / Ni siquiera me di cuenta de que no ejecuté la función ...: / ¡Pero fue una idea genial!
Ismael Miguel el
1

R 40 bytes

for(i in rev(il)){dd=dd[order(dd[,i]),]}

Explicación:

La lista de listas se representa mejor como un marco de datos en R:

ll2 = list(c(5,3,4), c(5,3,7), c(6,2,1), c(6,1,3), c(5,2,1))
dd = data.frame(do.call(rbind, ll2))
dd
      X1 X2 X3
    1  5  3  4
    2  5  3  7
    3  6  2  1
    4  6  1  3
    5  5  2  1

Si la lista de índice es il (la indexación es de 1):

il = list(1, 2, 3)

La clasificación se puede hacer con el siguiente código:

for(i in rev(il)){dd = dd[order(dd[,i]),]}

Salida:

dd
  X1 X2 X3
5  5  2  1
1  5  3  4
2  5  3  7
4  6  1  3
3  6  2  1
rnso
fuente
1

Perl 6  23 20  19 bytes

->\a,\b{b.sort:{.[|a]}}
{$^a;$^b.sort:{.[|$a]}}
{$^b.sort: *.[|$^a]}
{$^b.sort: *[|$^a]}
Brad Gilbert b2gills
fuente
1

Raqueta 218 bytes

(λ(il ll)(define qsl(λ(l i)(if(null? l)l(let*((h(first l))(t(rest l))(g(λ(ff)(filter(λ(x)(ff(list-ref x i)
(list-ref h i)))t))))(append(qsl(g <)i)(list h)(qsl(g >=)i))))))(for((i(reverse il)))(set! ll(qsl ll i)))ll)

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):

(define qsl
  (λ(l i)
    (if (null? l)
        l
        (let* ((h (first l))
               (t (rest  l))
               (g (λ(ff) (filter (λ(x) (ff (list-ref x i) (list-ref h i))) t))))
          (append (qsl (g <) i)
                  (list h)
                  (qsl (g >=) i)
                  )))))
(define f
  (λ(il ll)
    (for ((i (reverse il)))
      (set! ll (qsl ll i)))
    ll))

Pruebas:

(f (list 0 1 2) (list (list 5 3 4) (list 5 3 7) (list 6 2 1) (list 6 1 3) (list 5 2 1)))
(f [list 1 2] [list [list 5 3 4] [list 6 2 1] [list 5 2 3]])

Salida:

'((5 2 1) (5 3 4) (5 3 7) (6 1 3) (6 2 1))
'((6 2 1) (5 2 3) (5 3 4))
rnso
fuente
1

PHP, 139 bytes

usa el nuevo operador de nave espacial y usa

<?$a=$_GET[a];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,c);echo json_encode($a);

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 bytes

versión con crear un índice propio 197 Bytes como en una biblioteca real

<?$m=min(array_map(min,$a=$_GET[a]));foreach($a as$p=>$v){$k="";foreach($s=$_GET[s]as$f){$k.=str_pad($v[$f]-$m,5,0,0);}$k.=str_pad($p,5,0,0);$r[$k]=$v;}ksort($r);echo json_encode(array_values($r));
Jörg Hülsermann
fuente
Puedes intentar usarlo <?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);. $_GETes un superglobal: significa que ya es global en todas partes. Elimina global$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).
Ismael Miguel
@IsmaelMiguel Me siento como un idiota al no haber visto que uso el global solo dentro de la función.
Jörg Hülsermann
Las sortfunciones 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 para usort.
Titus
@Titus No se puede utilizar una función anónima debido c($x,$y,$i)al final del cuerpo de la función.
Ismael Miguel
@ JörgHülsermann No se preocupe, todos cometemos errores tontos.
Ismael Miguel
0

Clojure, 29 bytes

#(sort-by(fn[c](mapv c %))%2)

Nicely sort-byes estable y sabe cómo ordenar vectores, y los vectores pueden funcionar como funciones. ([4 6 9 7] 2)es 9(indexación basada en 0).

NikoNyrh
fuente