Diberikan daftar indeks dan nol atau lebih daftar bilangan bulat, mengeluarkan daftar bilangan bulat, diurutkan dalam urutan naik, dengan prioritas utama dari input pertama.
Contoh
Biarkan kunci input menjadi [1, 0, 2]
, dan input daftar menjadi [[5, 3, 4], [6, 2, 1], [5, 2, 1]]
. Daftar itu perlu diurutkan berdasarkan elemen kedua, lalu elemen pertama, lalu elemen ketiga, dalam urutan menaik:
- Pertama, kami mengurutkan berdasarkan nilai pada indeks
1
:[[6, 2, 1], [5, 2, 1], [5, 3, 4]]
- Selanjutnya, kami memutuskan ikatan apa pun dari pengurutan pertama menggunakan nilai pada indeks
0
:[[5, 2, 1], [6, 2, 1], [5, 3, 4]]
- Akhirnya, kami memutuskan ikatan yang tersisa dengan lem pada indeks
2
(ini sebenarnya tidak mengubah apa pun, karena tidak ada ikatan yang tersisa).
Detail
- Penyortiran stabil: jika dua elemen membandingkan sama sehubungan dengan kunci penyortiran yang diberikan, mereka harus tetap dalam urutan relatif yang sama dalam output. Misalnya, jika
A
danB
sama dengan tombol sortir yang diberikan, dan input tadi[..., A, ..., B, ...]
,A
harus ditempatkan sebelumnyaB
di output. - Kunci sortir tidak akan pernah merujuk elemen yang tidak ada di salah satu daftar input.
- Tidak ada tombol sortir yang akan diulang. Dengan demikian,
[1, 2, 1]
bukan daftar kunci pengurutan yang valid. - Elemen apa pun yang tidak direferensikan oleh kunci pengurutan tidak memperhitungkan faktor dalam urutan pengurutan. Hanya urutan relatif awal dan nilai-nilai elemen yang dirujuk oleh tombol pengurutan menentukan urutan output.
- Anda dapat memilih apakah kunci sortir diindeks nol atau diindeks satu.
- Tidak akan ada nilai negatif dalam kunci sortir. Jika Anda memilih untuk menggunakan satu-pengindeksan, tidak akan ada nol di kunci pengurutan juga.
- Nilai integer tidak akan melebihi rentang yang dapat diwakili secara asli oleh bahasa Anda. Jika bahasa yang Anda pilih secara bawaan mampu menghasilkan bilangan bulat presisi arbitrer (seperti Python), maka nilai bilangan bulat apa pun dapat ditampilkan dalam input, tergantung pada kendala memori.
Implementasi Referensi (Python 2)
#!/usr/bin/env python
keys = input()
lists = input()
print sorted(lists, key=lambda l:[l[x] for x in keys])
Uji Kasus
Format: keys lists -> output
. Semua kunci sortir diindeks nol.
[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]]
Jawaban:
Jelly , 4 byte
Cobalah online!
sumber
Þ
is "sort with sort sort key",⁴ị
menggunakan argumen baris perintah kedua untuk menyusun ulang array (menghasilkan kunci sortir yang berfungsi seperti pertanyaan yang diajukan), dan$
menimpa diutamakan sehingga program mem-parsing dengan benar.CJam , 13 byte
Blok tanpa nama yang mengharapkan daftar daftar dan daftar prioritas di atas tumpukan dan menggantinya dengan daftar daftar yang diurutkan.
Cobalah online! (Sebagai suite uji.)
Penjelasan
Penyortiran dengan pemutus pengikat dapat diterapkan dengan berulang kali menyortir seluruh daftar secara stabil dari kunci prioritas terendah ke kunci prioritas tertinggi.
sumber
Ruby, 35 byte
Lihat di eval.in: https://eval.in/652574
sumber
Haskell, 38 byte
Contoh penggunaan:
( 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
.sumber
Mathematica,
2219 byteMenggunakan indeks berbasis 1. Fungsi yang tidak disebutkan namanya ini dikerjakan , sehingga konvensi pemanggilan adalah:
Mathematica
SortBy
dapat mengambil daftar fungsi yang dalam hal ini fungsi individual digunakan sebagai pemutus hubungan berturut-turut, jadi itulah yang kami inginkan. Yang perlu kita lakukan adalah membuat daftar fungsi yang mengembalikan elemen daftar yang sesuai. Ini bisa dilakukan denganExtract
.Extract
biasanya merupakan fungsi binerExtract[list, index]
yang mengembalikan elemen daftar. Namun jika digunakan secara tidak sengaja, makaExtract[index]
mengembalikan fungsi yang mengambil elemen diindex
dari daftar yang diteruskan ke sana. Dengan kata lain,index
parameter dariExtract
dapat dikeringkan. Kami memanfaatkan ini dengan memetakanExtract
daftar indeks yang kami berikan, yang membuat daftar fungsi yang kami butuhkan.sumber
Extract/@#
seharusnyaExtract/@(#+1)
? Indeks input mulai dari 0.[{1, 0, 2}]
harus[{2, 1, 3}]
dalam contoh Anda? Memang, saat ini tampaknya memilah berdasarkan elemen pertama, lalu kepala, lalu elemen kedua.Python, 50 byte
Ini adalah versi rujukan untuk implementasi referensi yang sifatnya sangat sederhana.
l
adalah parameter daftar, dank
merupakan parameter tombol sortir.l
dapat berupa apa saja yang dapat diubah, selama elemen-elemennya dapat disubkripsikan oleh bilangan bulat (seperti daftar, tupel, atau dikt kunci int-keyed).k
bisa apa saja iterable.sumber
Brachylog , 29 byte
Cobalah online!
Penjelasan
Kami menggunakan fakta yang
o - Order
dapat digunakan dengan predikat tambahan sebagai input: kami memesan daftar dengan menggunakan untuk masing[Keys, a list]
- masing daftar elemena list
yang ada di indeksa key
dalam urutan mereka munculKeys
.sumber
CJam (12 byte)
Demo online . Ini adalah blok anonim (fungsi) yang mengambil argumen dalam urutan yang diberikan untuk kasus uji dan meninggalkan nilai yang diurutkan pada tumpukan. Itu bergantung pada built-in sort
$
yang stabil, tetapi juru bahasa resmi menjamin itu.Pembedahan
sumber
J, 6 byte
Kunci tidak diindeks. LHS adalah daftar kunci dan RHS adalah array nilai. Karena J tidak mendukung array yang tidak rata, setiap array harus dikotak.
Pemakaian
Penjelasan
sumber
JavaScript (ES6), 55 byte
Standar ECMAscript tidak menjamin bahwa sort yang mendasarinya stabil, sehingga kode 68-byte berikut tidak membuat asumsi itu:
sumber
Pyth,
54 byteCobalah online: Demonstrasi atau Test Suite
Terima kasih kepada @Maltysen untuk satu byte.
Penjelasan:
Saya sangat terkejut bahwa ini berhasil. Ini sintaks yang sangat aneh.
sumber
QE
denganF
JavaScript (ES6) 46
Pada setiap perbandingan selama pengurutan, pindai indeks kunci untuk menemukan urutan yang tepat
Uji
sumber
PHP,
212170 bytePHP tidak memiliki penyortiran yang stabil lagi ; memilih versi yang lebih lama tidak ada cara untuk melakukan panggilan balik rekursif dengan spesifikasi yang diperlukan. Tapi tidak masalah: menggunakan iterator panggilan balik rekursif akan membutuhkan biaya banyak; jadi saya bahkan tidak memeriksa apakah itu bisa melakukannya.
Lingkaran dalam bisa diganti dengan yang lain
foreach
; yang akan menghemat beberapa byte pada swapping. Tapi tanpa cek$b<$a
(atau$b<count($i)
), itu akan menghasilkan loop tak terbatas. Dan dengan cek itu,foreach
Biaya sebanyak menukarnya menang.Saya pertama kali melakukan perbandingan secara rekursif; tetapi iterasi menghemat banyak byte:
kerusakan
sumber
if($r>0){$s=$i[$b+1];$i[$b+1]=$i[$b];$i[$b]=$s;}
dapat ditulis sebagai$r>0&&$i[$b+1]^=$i[$b]^=$i[$b+1]^=$i[$b];
, menghemat 7 byte. Ini menggunakan pertukaran XOR dengan penyalahgunaan evaluasi hubung singkat untuk meniruif(){ ... }
. Swap hanya dijalankan jika dan hanya jika$r>0
. Ini menggunakan trik yang sama yang (kadang-kadang) digunakan dengan database. Seringkali, Anda akan melihatmysqli_connect( ... ) or die('Cannot connect');
.$b
loop. ;)m($i,$k);
sebelumvar_dump
dan Versi Anda akan menghasilkan sampah.R 40 byte
Penjelasan:
Daftar daftar paling baik direpresentasikan sebagai data.frame di R:
Jika daftar indeks il (pengindeksan adalah dari 1):
Penyortiran dapat dilakukan dengan kode berikut:
Keluaran:
sumber
Perl 6
23 2019 bytesumber
Racket 218 byte
Tidak tergabung (il = daftar indeks; ll = daftar daftar; qsl = quicksort untuk daftar daftar; h = kepala (elemen pertama); t = ekor (elemen sisa atau yang tersisa); g = filter yang dapat dimodifikasi fn):
Pengujian:
Keluaran:
sumber
PHP, 139 Bytes
gunakan operator pesawat ruang angkasa baru dan usort
Alih-alih
$x[$k[$i]]<=>$y[$k[$i]]
Anda dapat menggunakan di$x[$k[$i]]-$y[$k[$i]]
bawah Versi PHP lebih besar 7 - 2 Bytesversi dengan membuat indeks 197 Bytes sendiri seperti di perpustakaan nyata
sumber
<?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
adalah superglobal: itu berarti sudah menjadi global di mana-mana. Hapusglobal$k;
, pindahkan tugas di dalam fungsi dan selesai. Juga, karena ini menggunakan$_GET
, Anda harus menggunakan<?
. Dengan ini, Anda menghemat 10 byte. Ini akan (semoga) bekerja.sort
Fungsi PHP menggunakan quicksort; itu tidak stabil. Selain itu, Anda dapat menyimpan dua byte dengan-
alih - alih<=>
dan dua dengan panggilan balik anonyomous untukusort
.c($x,$y,$i)
pada akhir tubuh fungsi.Clojure, 29 byte
Baik
sort-by
stabil dan tahu cara mengurutkan vektor, dan vektor dapat beroperasi sebagai fungsi.([4 6 9 7] 2)
adalah9
(pengindeksan berbasis 0).sumber