Classificação de Chaves Múltiplas

20

Dada uma lista de índices e zero ou mais listas de números inteiros, produza as listas de números inteiros, classificadas em ordem crescente, com a prioridade principal da primeira entrada.

Exemplo

Deixe que as teclas sejam [1, 0, 2]e as listas sejam [[5, 3, 4], [6, 2, 1], [5, 2, 1]]. Essas listas precisam ser classificadas pelo segundo elemento, depois pelo primeiro elemento e depois pelo terceiro elemento, em ordem crescente:

  1. Primeiro, ordenamos pelos valores no índice 1:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
  2. Em seguida, quebramos quaisquer vínculos da primeira classificação usando os valores no índice 0:[[5, 2, 1], [6, 2, 1], [5, 3, 4]]
  3. Finalmente, quebramos quaisquer vínculos remanescentes com os vlues no índice 2(na verdade, isso não muda nada, porque não há vínculos remanescentes).

Detalhes

  • A classificação é estável: se dois elementos forem comparados em relação às chaves de classificação fornecidas, eles deverão permanecer na mesma ordem relativa na saída. Por exemplo, se Ae Bsão iguais nas chaves de classificação fornecidas, e a entrada foi [..., A, ..., B, ...], Adeve ser colocada antes Bna saída.
  • Uma chave de classificação nunca fará referência a um elemento inexistente em uma das listas de entrada.
  • Nenhuma tecla de classificação será repetida. Portanto, [1, 2, 1]não é uma lista válida de chaves de classificação.
  • Quaisquer elementos não referenciados pelas chaves de classificação não são considerados na ordem de classificação. Somente a ordem relativa inicial e os valores dos elementos referenciados pelas chaves de classificação determinam a ordem de saída.
  • Você pode escolher se as chaves de classificação são indexadas a zero ou a um.
  • Não haverá valores negativos nas chaves de classificação. Se você optar por usar a indexação única, também não haverá zeros nas chaves de classificação.
  • Valores inteiros não excederão o intervalo representável nativamente do seu idioma. Se o idioma escolhido tiver capacidade nativa de números inteiros de precisão arbitrária (como Python), qualquer valor inteiro poderá estar presente na entrada, sujeito a restrições de memória.

Implementação de referência (Python 2)

#!/usr/bin/env python

keys = input()
lists = input()

print sorted(lists, key=lambda l:[l[x] for x in keys])

Experimente online

Casos de teste

Formato keys lists -> output. Todas as chaves de classificação são indexadas a zero.

[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
fonte
Alguns dos casos de teste parecem irritantemente longos.
Fatalize 29/09/16
@Fatalize Eles destinam-se a cobrir casos em que existem poucas chaves de classificação em comparação com o comprimento das listas e casos em que existem muitas chaves de classificação.
Mego
1
@Fatalize É por isso que copiamos e colamos. Se necessário, use o Retina para alterar o formato para algo que você possa usar.
mbomb007
Podemos assumir que todas as linhas terão o mesmo comprimento se esse for o tipo de dados natural em nossa linguagem (ou seja, uma matriz)?
Luis Mendo
@LuisMendo Não. Você deve ser capaz de suportar matrizes irregulares.
Mego

Respostas:

6

Gelatina , 4 bytes

⁴ị$Þ

Experimente online!

Lynn
fonte
1
Você tem um detalhamento de como isso funciona?
JamEngulfer
@ JamEngulfer: Deveria ter sido especificado na resposta, mas: Þé "classificar com chave de classificação especificada", ⁴ịusa o segundo argumento da linha de comando para reordenar a matriz (produzindo uma chave de classificação que funcione conforme a pergunta) e $substitui o precedência para que o programa analise corretamente.
5

CJam , 13 bytes

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

Um bloco sem nome que espera a lista de listas e a lista de prioridades no topo da pilha e as substitui pela lista classificada de listas.

Experimente online! (Como uma suíte de teste.)

Explicação

A classificação com desempatadores pode ser implementada ordenando repetidamente toda a lista, passando da chave de prioridade mais baixa para a chave de prioridade mais 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
fonte
4

Haskell, 38 bytes

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

Exemplo de uso: ( sortOn.flip(map.(!!)) ) [2,1] [[9,2,-2,-10,-6], [3,-4,-2]]-> [[3,-4,-2],[9,2,-2,-10,-6]].

Não pointfree: f k v=sortOn(\x->map(\y->x!!y)k)v.

nimi
fonte
4

Mathematica, 22 19 bytes

SortBy[Extract/@#]&

Usa índices baseados em 1. Esta função sem nome é curada , portanto, a convenção de chamada é:

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

O Mathematica SortBypode ter uma lista de funções. Nesse caso, as funções individuais são usadas como desempatadores sucessivos, então é exatamente isso que queremos. Tudo o que precisamos fazer é criar uma lista de funções que retornam o elemento de lista correspondente. Isso pode ser feito com Extract. Extractnormalmente é uma função binária Extract[list, index]que retorna um elemento da lista. No entanto, se usado de forma unânime, Extract[index]retornará uma função que recupera o elemento em indexde uma lista passada para ele. Em outras palavras, o indexparâmetro de Extractpode ser curry. Utilizamos isso mapeando Extracta lista de índices que recebemos, o que cria a lista de funções que precisamos.

Martin Ender
fonte
Não deveria Extract/@#ser Extract/@(#+1)? O índice da entrada começa em 0.
JungHwan Min 29/09
2
@JHM "Você pode escolher se as chaves de classificação são indexadas a zero ou indexadas a um."
Martin Ender
Eu estou corrigido.
JungHwan Min 29/09/16
(Sem surpresa) elegante! Mas, como você está indexando 1, não deveria [{1, 0, 2}]estar [{2, 1, 3}]no seu exemplo? De fato, atualmente parece estar classificando por primeiro elemento, depois cabeça, depois segundo elemento.
Greg Martin
@GregMartin desculpe, copiar / colar falhar.
Martin Ender
3

Python, 50 bytes

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

Esta é uma versão trivial da implementação de referência. lé o parâmetro lists e ké o parâmetro das chaves de classificação. lpode ser iterável, desde que seus elementos sejam subscritos por números inteiros (como listas, tuplas ou ditados com chave int). kpode ser iterável.

Mego
fonte
3

Braquilog , 29 bytes

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

Experimente online!

Explicação

Usamos o fato de que o - Orderpode ser usado com um predicado adicional como entrada: ordenamos as listas usando para cada uma [Keys, a list]a lista dos elementos a listque estão no índice a keyna ordem em que aparecem 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
fonte
3

CJam (12 bytes)

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

Demonstração online . Este é um bloco anônimo (função) que pega os argumentos na ordem fornecida para os casos de teste e deixa o valor classificado na pilha. Ele depende do tipo interno $ser estável, mas o intérprete oficial garante isso.

Dissecação

{          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
fonte
3

J, 6 bytes

]/:{&>

As chaves são indexadas a zero. O LHS é a lista de chaves e o RHS é uma matriz de valores. Como J não suporta matrizes irregulares, cada matriz deve ser encaixotada.

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│
└────┴─┴─────────┘

Explicação

]/:{&>  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
milhas
fonte
2

JavaScript (ES6), 55 bytes

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

O padrão ECMAscript não garante que a classificação subjacente seja estável; portanto, o seguinte código de 68 bytes não faz essa suposição:

(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
fonte
2

Pitão, 5 4 bytes

@LDF

Experimente on-line: Demonstration or Test Suite

Graças a @ Maltysen por um byte.

Explicação:

@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

Fiquei realmente surpreso que isso funcionou. É uma sintaxe realmente estranha.

Jakube
fonte
Eu acho que você pode salvar substituindo QEporF
Maltysen
@ Maltysen Obrigado. Eu pensei que isso só era possível com um método regular de um token.
Jakube 29/09/19
1
Como as regras para o açúcar são muito adhoc e inconsistentes, o melhor é, infelizmente, apenas tentar se algo funciona.
Maltysen 29/09/16
2

JavaScript (ES6) 46

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

A cada comparação durante a classificação, verifique os índices principais para encontrar a ordem correta

Teste

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
fonte
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;}}}

O PHP não tem mais nenhuma classificação estável ; escolhendo uma versão mais antiga, não há como fazer um retorno de chamada recursivo com a especificação necessária. Mas esqueça: usar o iterador de retorno de chamada recursivo custaria toneladas; então nem chequei se isso poderia ser feito.

O loop interno pode ser substituído por outro foreach; isso economizaria alguns bytes na troca. Mas sem uma verificação para $b<$a(ou$b<count($i) ), isso resultará em um loop infinito. E com essa verificação, os foreachcustos, tanto quanto a troca, vence.

Primeiro fiz a comparação recursivamente; mas a iteração economiza toneladas de bytes:

demolir

// 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
fonte
Seu todo if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}pode ser escrito como $r>0&&$i[$b+1]^=$i[$b]^=$i[$b+1]^=$i[$b];, economizando 7 bytes. Isso usa uma troca XOR com abuso de avaliação de curto-circuito para emular um if(){ ... }. A troca é executada apenas se e somente se $r>0 . Isso usa o mesmo truque usado (às vezes) com bancos de dados. Muitas vezes, você verá mysqli_connect( ... ) or die('Cannot connect');.
Ismael Miguel
A troca XIs @IsmaelMiguel não funciona para matrizes. E economizaria 10 bytes, porque eu poderia torná-la a pós-condição do $bloop. ;)
Tito
Testei a troca XOR e funcionou (não testei com o restante do código). Escrevi 2 casos de teste: sandbox.onlinephpfunctions.com/code/… (você codifica) e sandbox.onlinephpfunctions.com/code/… (troca XOR). De acordo com o text-compare.com , a saída é idêntica.
Ismael Miguel
@IsmaelMiguel Para testar a função Você deve executá-la: insira m($i,$k);antes de var_dumpe Sua versão produzirá lixo.
Titus
: / Eu nem percebi que não executei a função ...: / Mas foi uma ideia legal!
Ismael Miguel
1

R 40 bytes

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

Explicação:

A lista de listas é melhor representada como um data.frame em 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

Se a lista de índices for il (a indexação é de 1):

il = list(1, 2, 3)

A classificação pode ser feita com o seguinte código:

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

Saída:

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
fonte
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
fonte
1

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

Ungolfed (il = lista de índices; ll = lista de listas; qsl = classificação rápida para lista de listas; h = cabeçalho (primeiro elemento); t = cauda (elementos restantes ou restantes); g = filtro modificável 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))

Teste:

(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]])

Saída:

'((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
fonte
1

PHP, 139 bytes

use o novo operador de nave espacial e use

<?$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);

Em vez de $x[$k[$i]]<=>$y[$k[$i]]você pode usar$x[$k[$i]]-$y[$k[$i]] em uma versão do PHP maior que 7-2 bytes

versão com criar um índice próprio 197 bytes como em uma 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
fonte
Você pode tentar usar <?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é uma superglobal: significa que já é global em todos os lugares. Remova o global$k;, mova a atribuição para dentro da função e pronto. Além disso, como isso está sendo usado $_GET, você deve usar <?. Com isso, você economiza 10 bytes. Esperemos que funcione.
Ismael Miguel
@IsmaelMiguel Sinto-me um idiota por não ter visto o global apenas dentro da função.
Jörg Hülsermann 02/10/16
sortFunções PHP usam quicksort; isso não é estável. Além disso, você pode salvar dois bytes com em -vez de <=>e dois com um retorno de chamada anônimo para usort.
Titus
@Titus Uma função anônima não pode ser usada devido c($x,$y,$i)ao final do corpo da função.
Ismael Miguel
@ JörgHülsermann Não se preocupe, todos cometemos erros tolos.
Ismael Miguel
0

Clojure, 29 bytes

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

Bem sort-byé estável e sabe como classificar vetores, e vetores podem operar como funções. ([4 6 9 7] 2)é 9(indexação baseada em 0).

NikoNyrh
fonte