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:
- Primeiro, ordenamos pelos valores no índice
1
:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
- 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]]
- 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
A
eB
são iguais nas chaves de classificação fornecidas, e a entrada foi[..., A, ..., B, ...]
,A
deve ser colocada antesB
na 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])
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]]
Respostas:
Gelatina , 4 bytes
Experimente online!
fonte
Þ
é "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.CJam , 13 bytes
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.
fonte
Ruby, 35 bytes
Veja-o em eval.in: https://eval.in/652574
fonte
Haskell, 38 bytes
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
.fonte
Mathematica,
2219 bytesUsa índices baseados em 1. Esta função sem nome é curada , portanto, a convenção de chamada é:
O Mathematica
SortBy
pode 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 comExtract
.Extract
normalmente é uma função bináriaExtract[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 emindex
de uma lista passada para ele. Em outras palavras, oindex
parâmetro deExtract
pode ser curry. Utilizamos isso mapeandoExtract
a lista de índices que recebemos, o que cria a lista de funções que precisamos.fonte
Extract/@#
serExtract/@(#+1)
? O índice da entrada começa em 0.[{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.Python, 50 bytes
Esta é uma versão trivial da implementação de referência.
l
é o parâmetro lists ek
é o parâmetro das chaves de classificação.l
pode ser iterável, desde que seus elementos sejam subscritos por números inteiros (como listas, tuplas ou ditados com chave int).k
pode ser iterável.fonte
Braquilog , 29 bytes
Experimente online!
Explicação
Usamos o fato de que
o - Order
pode ser usado com um predicado adicional como entrada: ordenamos as listas usando para cada uma[Keys, a list]
a lista dos elementosa list
que estão no índicea key
na ordem em que aparecemKeys
.fonte
CJam (12 bytes)
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
fonte
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
Explicação
fonte
JavaScript (ES6), 55 bytes
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:
fonte
Pitão,
54 bytesExperimente on-line: Demonstration or Test Suite
Graças a @ Maltysen por um byte.
Explicação:
Fiquei realmente surpreso que isso funcionou. É uma sintaxe realmente estranha.
fonte
QE
porF
JavaScript (ES6) 46
A cada comparação durante a classificação, verifique os índices principais para encontrar a ordem correta
Teste
fonte
PHP,
212170 bytesO 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, osforeach
custos, tanto quanto a troca, vence.Primeiro fiz a comparação recursivamente; mas a iteração economiza toneladas de bytes:
demolir
fonte
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 umif(){ ... }
. 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');
.$b
loop. ;)m($i,$k);
antes devar_dump
e Sua versão produzirá lixo.R 40 bytes
Explicação:
A lista de listas é melhor representada como um data.frame em R:
Se a lista de índices for il (a indexação é de 1):
A classificação pode ser feita com o seguinte código:
Saída:
fonte
Perl 6
23 2019 bytesfonte
Raquete 218 bytes
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):
Teste:
Saída:
fonte
PHP, 139 bytes
use o novo operador de nave espacial e use
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 bytesversão com criar um índice próprio 197 bytes como em uma biblioteca real
fonte
<?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 oglobal$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.sort
Funçõ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 parausort
.c($x,$y,$i)
ao final do corpo da função.Clojure, 29 bytes
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).fonte