Étant donné une liste d'indices et zéro ou plusieurs listes d'entiers, affichez les listes d'entiers, triées par ordre croissant, avec la priorité de clé à partir de la première entrée.
Exemple
Soit l'entrée des clés [1, 0, 2]
et l'entrée des listes [[5, 3, 4], [6, 2, 1], [5, 2, 1]]
. Ces listes doivent être triées par leur deuxième élément, puis le premier élément, puis le troisième élément, dans l'ordre croissant:
- Tout d'abord, nous trions par les valeurs à l'index
1
:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
- Ensuite, nous rompons tous les liens du premier tri en utilisant les valeurs à index
0
:[[5, 2, 1], [6, 2, 1], [5, 3, 4]]
- Enfin, nous rompons tous les liens restants avec les valeurs à l'index
2
(cela ne change en fait rien, car il n'y a plus de liens).
Détails
- Le tri est stable: si deux éléments se comparent égaux par rapport aux clés de tri données, ils doivent rester dans le même ordre relatif dans la sortie. Par exemple, si
A
etB
sont égaux sous les clés de tri données, et que l'entrée était[..., A, ..., B, ...]
,A
doit être placée avantB
dans la sortie. - Une clé de tri ne fera jamais référence à un élément inexistant dans l'une des listes d'entrée.
- Aucune clé de tri ne sera répétée. Ainsi,
[1, 2, 1]
n'est pas une liste valide de clés de tri. - Les éléments non référencés par les clés de tri ne sont pas pris en compte dans l'ordre de tri. Seuls l'ordre relatif initial et les valeurs des éléments référencés par les clés de tri déterminent l'ordre de sortie.
- Vous pouvez choisir si les clés de tri sont indexées zéro ou un indexées.
- Il n'y aura pas de valeurs négatives dans les clés de tri. Si vous choisissez d'utiliser une seule indexation, il n'y aura pas non plus de zéros dans les clés de tri.
- Les valeurs entières ne dépasseront pas la plage représentable nativement de votre langue. Si votre langue choisie est nativement capable d'entiers de précision arbitraire (comme Python), alors n'importe quelle valeur entière peut être présente dans l'entrée, sous réserve des contraintes de mémoire.
Implémentation de référence (Python 2)
#!/usr/bin/env python
keys = input()
lists = input()
print sorted(lists, key=lambda l:[l[x] for x in keys])
Cas de test
Format: keys lists -> output
. Toutes les clés de tri sont indexées zéro.
[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]]
Réponses:
Gelée , 4 octets
Essayez-le en ligne!
la source
Þ
est "trier avec la clé de tri spécifiée",⁴ị
utilise le deuxième argument de ligne de commande pour réorganiser le tableau (produisant une clé de tri qui fonctionne comme la question posée), et$
remplace la priorité afin que le programme analyse correctement.CJam , 13 octets
Un bloc sans nom qui attend la liste des listes et la liste des priorités en haut de la pile et les remplace par la liste triée des listes.
Essayez-le en ligne! (En tant que suite de tests.)
Explication
Le tri avec des bris d'égalité peut être mis en œuvre en triant de manière répétée la liste entière en passant de manière stable de la clé de priorité la plus basse à la clé de priorité la plus élevée.
la source
Rubis, 35 octets
Voir sur eval.in: https://eval.in/652574
la source
Haskell, 38 octets
Exemple d'utilisation:
( sortOn.flip(map.(!!)) ) [2,1] [[9,2,-2,-10,-6], [3,-4,-2]]
->[[3,-4,-2],[9,2,-2,-10,-6]]
.Non Pointfree:
f k v=sortOn(\x->map(\y->x!!y)k)v
.la source
Mathematica,
2219 octetsUtilise des indices basés sur 1. Cette fonction sans nom est curry , donc la convention d'appel est:
Mathematica
SortBy
peut prendre une liste de fonctions, auquel cas les fonctions individuelles sont utilisées en tant que bris d'égalité successifs, c'est donc exactement ce que nous voulons. Tout ce que nous devons faire est de créer une liste de fonctions qui renvoient l'élément de liste correspondant. Cela peut être fait avecExtract
.Extract
est normalement une fonction binaireExtract[list, index]
qui renvoie un élément de liste. Cependant, s'il est utilisé de façon unitaire,Extract[index]
renvoie une fonction qui récupère l'élément at àindex
partir d'une liste qui lui est passée. En d'autres termes, leindex
paramètre deExtract
peut être curry. Nous utilisons cela en mappantExtract
sur la liste des indices qui nous est donnée, ce qui crée la liste des fonctions dont nous avons besoin.la source
Extract/@#
êtreExtract/@(#+1)
? L'index de l'entrée commence à 0.[{1, 0, 2}]
être[{2, 1, 3}]
dans votre exemple? En effet, actuellement, il semble être trié par premier élément, puis par tête, puis par deuxième élément.Python, 50 octets
Il s'agit d'une version trivialement golfée de l'implémentation de référence.
l
est le paramètre lists etk
le paramètre sort keys.l
peut être n'importe quel itérable, tant que ses éléments sont indexables par des entiers (comme des listes, des tuples ou des dict à clé int).k
peut être tout itérable.la source
Brachylog , 29 octets
Essayez-le en ligne!
Explication
Nous utilisons
o - Order
en entrée le fait de pouvoir être utilisé avec un prédicat supplémentaire: nous ordonnons les listes en utilisant pour chacune[Keys, a list]
la liste des élémentsa list
dont l'index esta key
dans l'ordre dans lequel ils apparaissentKeys
.la source
CJam (12 octets)
Démo en ligne . Il s'agit d'un bloc (fonction) anonyme qui prend les arguments dans l'ordre donné pour les cas de test et laisse la valeur triée sur la pile. Il repose sur le tri intégré
$
stabilité du , mais l'interprète officiel le garantit.Dissection
la source
J, 6 octets
Les clés sont indexées zéro. Le LHS est la liste des clés et le RHS est un tableau de valeurs. Étant donné que J ne prend pas en charge les tableaux irréguliers, chaque tableau doit être encadré.
Usage
Explication
la source
JavaScript (ES6), 55 octets
La norme ECMAscript ne garantit pas que le tri sous-jacent est stable, donc le code de 68 octets suivant ne fait pas cette hypothèse:
la source
Pyth,
54 octetsEssayez-le en ligne: démonstration ou suite de tests
Merci à @Maltysen pour un octet.
Explication:
J'ai été vraiment surpris que cela fonctionne. C'est une syntaxe vraiment étrange.
la source
QE
parF
JavaScript (ES6) 46
À chaque comparaison pendant le tri, scannez les indices clés pour trouver le bon ordre
Tester
la source
PHP,
212170 octetsPHP n'a plus de tri stable intégré ; en choisissant une ancienne version, il n'y a aucun moyen de faire un rappel récursif avec la spécification requise. Mais peu importe: utiliser l' itérateur de rappel récursif coûterait des tonnes; donc je n'ai même pas vérifié si cela pouvait le faire.
La boucle intérieure pourrait être remplacée par une autre
foreach
; cela permettrait d'économiser quelques octets sur l'échange. Mais sans vérification$b<$a
(ou$b<count($i)
), cela se traduira par une boucle infinie. Et avec ce chèque, leforeach
coûts autant que l'échange gagne.J'ai d'abord fait la comparaison récursivement; mais l'itération économise des tonnes d'octets:
panne
la source
if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}
peut être écrit comme$r>0&&$i[$b+1]^=$i[$b]^=$i[$b+1]^=$i[$b];
, vous économisant 7 octets. Cela utilise un échange XOR avec abus d' évaluation de court-circuit pour émuler unif(){ ... }
. L'échange n'est exécuté que si et seulement si$r>0
. Cela utilise la même astuce qui est (parfois) utilisée avec les bases de données. Souvent, vous verrezmysqli_connect( ... ) or die('Cannot connect');
.$b
boucle. ;)m($i,$k);
avantvar_dump
et votre version produira des ordures.R 40 octets
Explication:
La liste des listes est mieux représentée comme un data.frame dans R:
Si la liste d'index est il (l'indexation est de 1):
Le tri peut être effectué avec le code suivant:
Production:
la source
Perl 6
23 2019 octetsla source
Raquette 218 octets
Non golfé (il = liste d'index; ll = liste de listes; qsl = tri rapide pour la liste de listes; h = head (premier élément); t = tail (reste ou éléments restants); g = filtre modifiable fn):
Essai:
Production:
la source
PHP, 139 octets
utiliser le nouvel opérateur de vaisseau spatial et usort
Au lieu de
$x[$k[$i]]<=>$y[$k[$i]]
vous pouvez utiliser$x[$k[$i]]-$y[$k[$i]]
sous une version PHP supérieure 7 - 2 octetsversion avec créer un index propre 197 octets comme dans une vraie bibliothèque
la source
<?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
est un superglobal: cela signifie qu'il est déjà un global partout. Supprimez leglobal$k;
, déplacez l'affectation à l'intérieur de la fonction et vous avez terminé. En outre, puisque cela utilise$_GET
, vous devez utiliser<?
. Avec cela, vous économisez 10 octets. Cela fonctionnera (espérons-le).sort
fonctions PHP utilisent quicksort; ce n'est pas stable. En dehors de cela, vous pouvez enregistrer deux octets avec-
au lieu de<=>
et deux avec un rappel anonyomous pourusort
.c($x,$y,$i)
à la fin du corps de la fonction.Clojure, 29 octets
Nicely
sort-by
est stable et sait trier les vecteurs, et les vecteurs peuvent fonctionner comme des fonctions.([4 6 9 7] 2)
is9
(indexation basée sur 0).la source