Bei einer gegebenen Liste von Indizes und null oder mehr Listen von ganzen Zahlen geben Sie die Listen von ganzen Zahlen in aufsteigender Reihenfolge mit der Schlüsselpriorität von der ersten Eingabe aus.
Beispiel
Die Tasteneingabe sei [1, 0, 2]
und die Listeneingabe sei [[5, 3, 4], [6, 2, 1], [5, 2, 1]]
. Diese Listen müssen nach dem zweiten Element, dem ersten Element und dem dritten Element in aufsteigender Reihenfolge sortiert werden:
- Zuerst sortieren wir nach den Werten am Index
1
:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
- Als nächstes lösen wir alle Bindungen von der ersten Sortierung unter Verwendung der Werte am Index
0
:[[5, 2, 1], [6, 2, 1], [5, 3, 4]]
- Schließlich brechen wir alle verbleibenden Bindungen zu den Werten am Index
2
(dies ändert eigentlich nichts, da keine Bindungen mehr übrig sind).
Einzelheiten
- Die Sortierung ist stabil: Wenn zwei Elemente in Bezug auf die angegebenen Sortierschlüssel gleich sind, müssen sie in der Ausgabe in derselben relativen Reihenfolge bleiben. Wenn z. B.
A
undB
unter den angegebenen Sortierschlüsseln gleich sind und die Eingabe war[..., A, ..., B, ...]
,A
muss sie vorB
der Ausgabe platziert werden. - Ein Sortierschlüssel verweist niemals auf ein nicht vorhandenes Element in einer der Eingabelisten.
- Es wird kein Sortierschlüssel wiederholt. Es
[1, 2, 1]
handelt sich also nicht um eine gültige Liste von Sortierschlüsseln. - Alle Elemente, auf die die Sortierschlüssel nicht verweisen, werden nicht in die Sortierreihenfolge einbezogen. Nur die anfängliche relative Reihenfolge und die Werte der Elemente, auf die die Sortierschlüssel verweisen, bestimmen die Ausgabereihenfolge.
- Sie können wählen, ob die Sortierschlüssel nullindiziert oder einsindiziert sind.
- Die Sortierschlüssel enthalten keine negativen Werte. Wenn Sie sich für die Indizierung mit einem Index entscheiden, werden auch in den Sortierschlüsseln keine Nullen angezeigt.
- Ganzzahlige Werte überschreiten nicht den Bereich, den Ihre Sprache von Haus aus darstellen kann. Wenn die von Ihnen gewählte Sprache von Haus aus Ganzzahlen mit willkürlicher Genauigkeit unterstützt (wie Python), kann ein beliebiger ganzzahliger Wert in der Eingabe vorhanden sein, abhängig von Speicherbeschränkungen.
Referenzimplementierung (Python 2)
#!/usr/bin/env python
keys = input()
lists = input()
print sorted(lists, key=lambda l:[l[x] for x in keys])
Testfälle
Format: keys lists -> output
. Alle Sortierschlüssel sind nullindiziert.
[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]]
Antworten:
Gelee , 4 Bytes
Probieren Sie es online!
quelle
Þ
ist "sortieren mit angegebenem Sortierschlüssel",⁴ị
verwendet das zweite Befehlszeilenargument, um das Array neu zu ordnen (wobei ein Sortierschlüssel erzeugt wird, der wie die Frage funktioniert), und$
überschreibt den Vorrang, damit das Programm korrekt analysiert.CJam , 13 Bytes
Ein unbenannter Block, der die Liste der Listen und die Liste der Prioritäten über dem Stapel erwartet und durch die sortierte Liste der Listen ersetzt.
Probieren Sie es online! (Als Testsuite.)
Erläuterung
Das Sortieren mit Verbindungsunterbrechern kann implementiert werden, indem die gesamte Liste wiederholt stabil vom Schlüssel mit der niedrigsten Priorität zum Schlüssel mit der höchsten Priorität sortiert wird.
quelle
Ruby, 35 Bytes
Sehen Sie es auf eval.in: https://eval.in/652574
quelle
Haskell, 38 Bytes
Anwendungsbeispiel:
( sortOn.flip(map.(!!)) ) [2,1] [[9,2,-2,-10,-6], [3,-4,-2]]
->[[3,-4,-2],[9,2,-2,-10,-6]]
.Nicht pointfree:
f k v=sortOn(\x->map(\y->x!!y)k)v
.quelle
Mathematica,
2219 BytesVerwendet 1-basierte Indizes. Diese unbenannte Funktion wird curried , so dass die Aufrufkonvention ist:
Mathematica's
SortBy
kann eine Liste von Funktionen aufnehmen. In diesem Fall werden die einzelnen Funktionen als aufeinanderfolgende Unterbrecher verwendet, also ist es genau das, was wir wollen. Wir müssen nur eine Liste von Funktionen erstellen, die das entsprechende Listenelement zurückgeben. Dies kann mit erfolgenExtract
.Extract
ist normalerweise eine Binärfunktion,Extract[list, index]
die ein Listenelement zurückgibt. Wenn es jedoch nur einmal verwendet wird, wirdExtract[index]
eine Funktion zurückgegeben, die das Elementindex
von einer an sie übergebenen Liste abruft . Mit anderen Worten kann derindex
Parameter vonExtract
gewechselt werden. Dies machenExtract
wir uns zunutze, indem wir über die Liste der Indizes, die wir erhalten, eine Zuordnung vornehmen , wodurch die Liste der Funktionen erstellt wird, die wir benötigen.quelle
Extract/@#
seinExtract/@(#+1)
? Der Index der Eingabe beginnt bei 0.[{1, 0, 2}]
sein[{2, 1, 3}]
in Ihrem Beispiel? Tatsächlich scheint es sich derzeit um eine Sortierung nach erstem Element, dann nach Kopf und dann nach zweitem Element zu handeln.Python, 50 Bytes
Dies ist eine einfach zu spielende Version der Referenzimplementierung.
l
ist der Parameter lists undk
der Parameter sort keys.l
kann beliebig iterierbar sein, solange seine Elemente durch ganze Zahlen (wie Listen, Tupel oder int-keyed Dicts) subskriptierbar sind.k
kann jede iterable sein.quelle
Brachylog , 29 Bytes
Probieren Sie es online!
Erläuterung
Wir verwenden die Tatsache, dass
o - Order
ein zusätzliches Prädikat als Eingabe verwendet werden kann: Wir ordnen die Listen in der Reihenfolge an, in der sie auftauchen, indem wir für jede[Keys, a list]
Liste die Elemente verwenden,a list
deren Index am Anfang steht .a key
Keys
quelle
CJam (12 Bytes)
Online-Demo . Dies ist ein anonymer Block (eine Funktion), der die Argumente in der angegebenen Reihenfolge für die Testfälle verwendet und den sortierten Wert auf dem Stapel belässt. Es setzt voraus, dass die eingebaute Sorte
$
stabil ist, aber der offizielle Dolmetscher garantiert dies.Präparation
quelle
J, 6 Bytes
Schlüssel sind mit einem Index von Null versehen. Die LHS ist die Liste der Schlüssel und die RHS ist ein Array von Werten. Da J keine unregelmäßigen Arrays unterstützt, muss jedes Array mit einem Kästchen versehen werden.
Verwendung
Erläuterung
quelle
JavaScript (ES6), 55 Byte
Der ECMAscript-Standard garantiert nicht, dass die zugrunde liegende Sortierung stabil ist, sodass der folgende 68-Byte-Code diese Annahme nicht trifft:
quelle
Pyth,
54 BytesProbieren Sie es online aus: Demo oder Test Suite
Danke an @Maltysen für ein Byte.
Erläuterung:
Ich war wirklich überrascht, dass dies funktionierte. Es ist eine wirklich seltsame Syntax.
quelle
QE
durchF
JavaScript (ES6) 46
Scannen Sie bei jedem Vergleich während des Sortierens die Schlüsselindizes, um die richtige Reihenfolge zu finden
Prüfung
quelle
PHP,
212170 BytesPHP hat keine stabile Sortierung mehr eingebaut ; Bei einer älteren Version ist es nicht möglich, einen rekursiven Rückruf mit der erforderlichen Spezifikation durchzuführen. Aber vergiss nicht: Die Verwendung des rekursiven Callback-Iterators würde Tonnen kosten. also habe ich nicht mal nachgesehen, ob das klappt.
Die innere Schleife könnte durch eine andere ersetzt werden
foreach
; das würde ein paar Bytes beim Tauschen sparen. Ohne ein Häkchen bei$b<$a
(oder$b<count($i)
) führt dies jedoch zu einer Endlosschleife. Und mit diesem Scheck gewinnen dieforeach
Kosten so viel wie der Tausch.Ich habe den Vergleich zuerst rekursiv durchgeführt. Aber Iteration spart Tonnen von Bytes:
Nervenzusammenbruch
quelle
if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}
kann so geschrieben werden$r>0&&$i[$b+1]^=$i[$b]^=$i[$b+1]^=$i[$b];
, dass Sie 7 Bytes sparen. Hierbei wird ein XOR-Swap mit missbräuchlicher Kurzschlussauswertung verwendet , um eine zu emulierenif(){ ... }
. Der Swap wird nur dann und nur dann ausgeführt, wenn$r>0
. Dies verwendet den gleichen Trick, der (manchmal) bei Datenbanken verwendet wird. Oft wirst du sehenmysqli_connect( ... ) or die('Cannot connect');
.$b
Schleife machen könnte. ;)m($i,$k);
vor dem einfügenvar_dump
und Ihre Version wird Müll produzieren.R 40 Bytes
Erläuterung:
Die Liste der Listen wird am besten als data.frame in R dargestellt:
Wenn die Indexliste il ist (die Indexierung ist von 1):
Das Sortieren kann mit folgendem Code erfolgen:
Ausgabe:
quelle
Perl 6
23 2019 Bytesquelle
Schläger 218 Bytes
Ungolfed (il = Indexliste; ll = Liste der Listen; qsl = Quicksort für Liste der Listen; h = Kopf (erstes Element); t = Schwanz (restliche oder verbleibende Elemente); g = modifizierbarer Filter fn):
Testen:
Ausgabe:
quelle
PHP, 139 Bytes
benutze den neuen Raumschiff Operator und benutze usort
Anstelle von
$x[$k[$i]]<=>$y[$k[$i]]
Ihnen können verwenden$x[$k[$i]]-$y[$k[$i]]
unter einer PHP-Version größere 7 - 2 Bytes verwendenversion mit create a own index 197 Bytes wie in einer echten bibliothek
quelle
<?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
ist ein Superglobal: Es bedeutet, dass es bereits überall ein Global ist. Entfernen Sie dieglobal$k;
, verschieben Sie die Zuordnung innerhalb der Funktion und fertig. Da dies verwendet wird$_GET
, müssen Sie auch verwenden<?
. Damit sparen Sie 10 Bytes. Es wird (hoffentlich) funktionieren.sort
Funktionen verwenden Quicksort; das ist nicht stabil Abgesehen davon können Sie zwei Bytes speichern mit-
statt<=>
und zwei mit einem anonyomous Rückruf fürusort
.c($x,$y,$i)
am Ende des Funktionskörpers eine Funktion befindet.Clojure, 29 Bytes
Schön
sort-by
ist stabil und weiß, wie man Vektoren sortiert, und Vektoren können als Funktionen fungieren.([4 6 9 7] 2)
ist9
(0-basierte Indizierung).quelle