Biorąc pod uwagę listę indeksów i zero lub więcej list liczb całkowitych, wypisz listy liczb całkowitych, posortowane w porządku rosnącym, z kluczowym priorytetem od pierwszego wejścia.
Przykład
Niech wpisane zostaną klucze [1, 0, 2]
, a listy będą [[5, 3, 4], [6, 2, 1], [5, 2, 1]]
. Listy te należy posortować według drugiego elementu, następnie pierwszego elementu, a następnie trzeciego elementu, w porządku rosnącym:
- Najpierw sortujemy według wartości w indeksie
1
:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
- Następnie zrywamy wszelkie powiązania z pierwszego sortowania, używając wartości w indeksie
0
:[[5, 2, 1], [6, 2, 1], [5, 3, 4]]
- Na koniec zrywamy wszelkie pozostałe więzi z vlues na indeksie
2
(to tak naprawdę nic nie zmienia, ponieważ nie ma już żadnych więzi).
Detale
- Sortowanie jest stabilne: jeśli dwa elementy są równe w odniesieniu do podanych kluczy sortowania, muszą pozostać w tej samej względnej kolejności na wyjściu. Na przykład, jeśli
A
iB
są równe pod danym kluczom sortowania, a dane wejściowe były[..., A, ..., B, ...]
,A
muszą zostać umieszczone przedB
wyjściem. - Klawisz sortowania nigdy nie będzie odwoływał się do nieistniejącego elementu na jednej z list wejściowych.
- Żaden klawisz sortowania nie zostanie powtórzony. Dlatego
[1, 2, 1]
nie jest prawidłową listą kluczy sortowania. - Żadne elementy, do których nie odnoszą się klucze sortowania, nie uwzględniają kolejności sortowania. Tylko początkowa względna kolejność i wartości elementów, do których odnoszą się klucze sortowania, określają kolejność wyjściową.
- Możesz wybrać, czy klucze sortowania mają być indeksowane zerowo, czy indeksowane jednokrotnie.
- W kluczach sortowania nie będzie żadnych wartości ujemnych. Jeśli zdecydujesz się na użycie jednego indeksowania, w kluczach sortowania nie będzie też zer.
- Wartości całkowite nie przekroczą natywnie reprezentatywnego zakresu twojego języka. Jeśli wybrany język jest natywnie zdolny do liczb całkowitych o dowolnej precyzji (jak Python), wówczas dowolna wartość liczbowa może być obecna na wejściu, z zastrzeżeniem ograniczeń pamięci.
Implementacja referencji (Python 2)
#!/usr/bin/env python
keys = input()
lists = input()
print sorted(lists, key=lambda l:[l[x] for x in keys])
Przypadki testowe
Format: keys lists -> output
. Wszystkie klucze sortowania są indeksowane od zera.
[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]]
Odpowiedzi:
Galaretka , 4 bajty
Wypróbuj online!
źródło
Þ
jest „sortuj z określonym kluczem sortowania”,⁴ị
używa drugiego argumentu wiersza polecenia do zmiany kolejności tablicy (tworząc klucz sortowania, który działa jak pytanie), i$
zastępuje parametr pierwszeństwo, aby program poprawnie analizował.CJam , 13 bajtów
Nienazwany blok, który oczekuje listy list i listy priorytetów na górze stosu i zastępuje je posortowaną listą list.
Wypróbuj online! (Jako zestaw testowy.)
Wyjaśnienie
Sortowanie za pomocą przerywników remisu może być realizowane przez wielokrotne sortowanie całej listy w sposób stabilny, od klucza o najniższym priorytecie do klucza o najwyższym priorytecie.
źródło
Rubin, 35 bajtów
Zobacz na eval.in: https://eval.in/652574
źródło
Haskell, 38 bajtów
Przykład użycia:
( 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
.źródło
Mathematica,
2219 bajtówWykorzystuje wskaźniki oparte na 1. Ta nienazwana funkcja to curry , więc konwencja wywoływania to:
Matematyka
SortBy
może wziąć listę funkcji, w którym to przypadku poszczególne funkcje są używane jako kolejne elementy rozstrzygające, więc właśnie tego chcemy. Wszystko, co musimy zrobić, to utworzyć listę funkcji zwracających odpowiedni element listy. Można to zrobić za pomocąExtract
.Extract
jest zwykle funkcją binarną,Extract[list, index]
która zwraca element listy. Jeśli jednak użyje się go jednoznacznie, wówczasExtract[index]
zwraca funkcję, która pobiera elementindex
z z listy do niego przekazanej. Innymi słowy,index
parametrExtract
może być curry. Korzystamy z tego, mapującExtract
listę podanych nam indeksów, co tworzy listę potrzebnych nam funkcji.źródło
Extract/@#
byćExtract/@(#+1)
? Indeks danych wejściowych zaczyna się od 0[{1, 0, 2}]
być[{2, 1, 3}]
w swoim przykładzie? Rzeczywiście, obecnie wydaje się, że sortuje według pierwszego elementu, następnie głowy, a następnie drugiego elementu.Python, 50 bajtów
Jest to wersja implementacji referencyjnej, w której gra się w golfa.
l
to parametr listy ik
parametr kluczy sortowania.l
może być dowolną iterowalną, o ile jej elementy można indeksować za pomocą liczb całkowitych (takich jak listy, krotki lub dykta z kluczem).k
może być dowolną iterowalną.źródło
Brachylog , 29 bajtów
Wypróbuj online!
Wyjaśnienie
Korzystamy z faktu, że
o - Order
można użyć z dodatkowym predykatem jako danych wejściowych: porządkujemy listy, używając dla każdej[Keys, a list]
listy elementów,a list
które są indeksowanea key
w kolejności, w jakiej się pojawiająKeys
.źródło
CJam (12 bajtów)
Demo online . Jest to anonimowy blok (funkcja), który przyjmuje argumenty w podanej kolejności dla przypadków testowych i pozostawia posortowaną wartość na stosie. Opiera się na wbudowanym rodzaju
$
stabilności , ale oficjalny tłumacz gwarantuje to.Sekcja
źródło
J, 6 bajtów
Klucze są indeksowane od zera. LHS to lista kluczy, a RHS to tablica wartości. Ponieważ J nie obsługuje tablic obdartych, każda tablica musi być umieszczona w ramce.
Stosowanie
Wyjaśnienie
źródło
JavaScript (ES6), 55 bajtów
Standard ECMAscript nie gwarantuje stabilności sortowania bazowego, więc poniższy 68-bajtowy kod nie przyjmuje takiego założenia:
źródło
Pyth
54 bajtówWypróbuj online: pakiet demonstracyjny lub testowy
Dzięki @Maltysen za jeden bajt.
Wyjaśnienie:
Byłem naprawdę zaskoczony, że to zadziałało. To naprawdę dziwna składnia.
źródło
QE
przezF
JavaScript (ES6) 46
Przy każdym porównaniu podczas sortowania skanuj kluczowe indeksy, aby znaleźć właściwą kolejność
Test
źródło
PHP,
212170 bajtówPHP nie ma już wbudowanego stabilnego sortowania ; wybranie starszej wersji nie ma możliwości wykonania rekurencyjnego wywołania zwrotnego z wymaganą specyfikacją. Ale nieważne: za pomocą iteratora rekurencyjnego wywołania zwrotnego kosztowałoby mnóstwo; więc nawet nie sprawdziłem, czy to da radę.
Wewnętrzną pętlę można zastąpić inną
foreach
; zaoszczędziłoby to trochę bajtów podczas wymiany. Ale bez sprawdzenia$b<$a
(lub$b<count($i)
) spowoduje to nieskończoną pętlę. I dzięki tej kontroli, Theforeach
wygrane kosztują tyle samo co zamiana.Najpierw porównałem rekurencyjnie; ale iteracja oszczędza mnóstwo bajtów:
awaria
źródło
if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}
można zapisać jako$r>0&&$i[$b+1]^=$i[$b]^=$i[$b+1]^=$i[$b];
, oszczędzając 7 bajtów. Używa wymiany XOR z nadużyciem oceny zwarcia w celu emulacjiif(){ ... }
. Zamiana jest wykonywana tylko wtedy i tylko wtedy$r>0
. Wykorzystuje tę samą sztuczkę, która jest (czasami) używana w bazach danych. Często zobaczyszmysqli_connect( ... ) or die('Cannot connect');
.$b
końcowy pętli. ;)m($i,$k);
przed,var_dump
a Twoja wersja będzie produkować śmieci.R 40 bajtów
Wyjaśnienie:
Lista list jest najlepiej reprezentowana jako data.frame w R:
Jeśli lista indeksów jest il (indeksowanie jest od 1):
Sortowania można dokonać za pomocą następującego kodu:
Wynik:
źródło
Perl 6
23 2019 bajtówźródło
Rakieta 218 bajtów
Niegolfowany (il = lista indeksów; ll = lista list; qsl = szybkie sortowanie listy list; h = głowa (pierwszy element); t = ogon (pozostałe lub pozostałe elementy); g = modyfikowalny filtr fn):
Testowanie:
Wynik:
źródło
PHP, 139 bajtów
skorzystaj z nowego operatora statku kosmicznego i usort
Zamiast tego
$x[$k[$i]]<=>$y[$k[$i]]
możesz używać$x[$k[$i]]-$y[$k[$i]]
w wersji PHP większej 7 - 2 bajtówwersja z własnym indeksem 197 bajtów jak w prawdziwej bibliotece
źródło
<?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
jest superglobalna: oznacza, że wszędzie jest już globalna. Usuńglobal$k;
, przenieś przypisanie do funkcji i gotowe. Ponadto, ponieważ to używa$_GET
, musisz użyć<?
. Dzięki temu oszczędzasz 10 bajtów. To (miejmy nadzieję) zadziała.sort
Funkcje PHP używają quicksort; to nie jest stabilne. Oprócz tego możesz zapisać dwa bajty z-
zamiast<=>
i dwa z anonimowym wywołaniem zwrotnymusort
.c($x,$y,$i)
na końcu treści funkcji.Clojure, 29 bajtów
Ładnie
sort-by
jest stabilny i umie sortować wektory, a wektory mogą działać jako funkcje.([4 6 9 7] 2)
jest9
(indeksowanie 0).źródło