Ringkasan
Diberikan daftar bilangan bulat, kembalikan indeks setiap bilangan bulat akan berakhir pada saat diurutkan.
Misalnya, jika daftar itu [0,8,-1,5,8]
, Anda harus kembali [1,3,0,2,4]
. Perhatikan bahwa keduanya 8
mempertahankan urutan relatif satu sama lain (pengurutannya stabil).
Dengan kata lain: Untuk setiap elemen dalam daftar, kembalikan jumlah elemen dalam daftar yang: Lebih kecil dari elemen yang dipilih ATAU (sama dengan elemen DAN muncul sebelum elemen yang dipilih)
Indeks harus dimulai dengan 0 (bukan 1) EDIT: mengingat pushback besar, saya akan mengizinkan indeks berbasis 1.
Kasus uji:
0 -> 0
23 -> 0
2,3 -> 0,1
3,2 -> 1,0
2,2 -> 0,1
8,10,4,-1,-1,8 -> 3,5,2,0,1,4
0,1,2,3,4,5,6,7 -> 0,1,2,3,4,5,6,7
7,6,5,4,3,2,1,0 -> 7,6,5,4,3,2,1,0
4,4,0,1,1,2,0,1 -> 6,7,0,2,3,5,1,4
1,1,1,1,1,1,1,1 -> 0,1,2,3,4,5,6,7
1,1,1,1,1,1,1,0 -> 1,2,3,4,5,6,7,0
code-golf
array-manipulation
sorting
Nathan Merrill
sumber
sumber
[0 1 ... n-1]
.8,10,4,-1,-1
test case sangat menipu. Coba yang4,4,0,1,1,2,0,1
pertama.Jawaban:
APL, 2 byte
Built-in "naik", diterapkan dua kali. Bekerja jika pengindeksan dimulai pada 0, yang bukan merupakan standar untuk semua rasa APL. Coba di sini!
Mengapa ini bekerja?
⍋x
mengembalikan daftar indeks yang akan diurutkan secara stabilx
. Sebagai contoh:karena jika Anda mengambil elemen
2
, maka6
, maka3
... Anda mendapatkan daftar yang diurutkan secara stabil:Tetapi daftar indeks yang menjawab pertanyaan ini agak berbeda: pertama kita ingin indeks elemen terkecil, lalu terkecil terkecil, dll - lagi-lagi, menjaga urutan aslinya.
Jika kita melihat
⍋x
, meskipun, kita melihat hal itu dapat memberi kita daftar ini dengan mudah: yang posisi dari0
dalam⍋x
memberitahu kita di mana elemen terkecil akan berakhir setelah menyortir, dan posisi dari1
dalam⍋x
memberitahu kita di mana elemen terkecil kedua akan berakhir , dll.Tapi kita tahu
⍋x
persis mengandung angka [0, 1 ... n − 1] . Jika kita nilai lagi , kita hanya akan mendapatkan indeks0
masuk⍋x
, lalu indeks1
masuk⍋x
, dll., Itulah tepatnya yang kita minati.Jadi jawabannya adalah
⍋⍋x
.sumber
Jelly, 2 byte
Nilai naik dua kali. 1-diindeks. Cobalah online!
sumber
JavaScript ES6,
8782797470 byteTidak suka menggunakan objek tetapi tampaknya merupakan cara terpendek untuk melacak dupes
Penjelasan
sumber
K ,
52 byteTingkatkan (
<
) dua kali. JohnE menyimpan tiga byte dengan menunjukkan ekspresi diam-diam yang ada di K! Sangat keren. Cobalah.sumber
<<
. Coba di sini .Haskell,
5048 byteContoh penggunaan:
m.m $ [4,4,0,1,1,2,0,1]
->[6,7,0,2,3,5,1,4]
.Ini
map snd.sort.zip x [0..]
diterapkan dua kali pada input, yaitu memasangkan setiap elemen e dengan indeks i ((e,i)
), mengurutkannya menghapus elemen pertama. Ulangi satu kali.@ Lynn datang dengan
m=map snd.sort.(`zip`[0..])
yang memiliki jumlah byte yang sama.sumber
Python 2,
6760 byteTerima kasih kepada @xnor karena bermain golf 7 byte!
Uji di Ideone .
sumber
enumerate
dapat dilakukan lebih pendek denganzip
:l=input();x=zip(l,range(len(l)))
.PowerShell v2 +, 63 byte
Mengambil input
$n
, menyalurkan melalui loop ke setiap elemen|%{...}
. Setiap iterasi, kitasort
$n
dan dapatkanIndexOf
elemen kita saat ini$_
. Ini menghitung berapa banyak item lebih kecil dari elemen saat ini. Kami menambahkan bahwa sepotong$n
, yang memperluas setiap iterasi loop, dari elemen yang sama dengan elemen saat ini$_
dan mengambil.Count
itu. Kami kemudian mengurangi-1
sehingga kami tidak menghitung elemen kami saat ini, dan angka itu ditinggalkan di saluran pipa. Output pada akhirnya tersirat.Contohnya
sumber
CJam, 15 byte
Cobalah online!
Penjelasan
sumber
J, 5 byte
Tingkatkan (
/:
) dua kali (^:2
). Diindeks 0.Untuk mencobanya, ketik
f =: /:^:2
dan kemudianf 4 4 0 1 1 2 0 1
ke tryj.tk .sumber
/:@/:
dengan jumlah byte yang sama.MATL,
1094 byte4 Bytes disimpan berkat @Luis
Solusi ini menggunakan pengindeksan berbasis 1
Cobalah secara Online
sumber
05AB1E, 12 byte
Dijelaskan
Cobalah online
sumber
Python 2, 67 byte
xnatau menyimpan dua byte.
sumber
a=input();p=[]\nfor x in a:print sorted(a).index(x)+p.count(x);p+=x,
Haskell, 40 byte
Beri anotasi pada setiap elemen dengan indeksnya, lalu petakan setiap elemen dengan jumlah elemen yang lebih kecil, lalu buat indeks. Tidak ada penyortiran.
sumber
Julia, 17 byte
1-diindeks. Tingkatkan (
sortperm
) dua kali. Coba di sini.EDIT: Dennis menyimpan empat byte dengan memberikan nama barang operator-y! Julia aneh.
sumber
JavaScript (ES6), 52 byte
Tentukan
g
sebagai fungsi tingkat, yang mengembalikan array indeks tempat semua elemen dalam array yang diurutkan akan berasal dari dalam array asli. Sayangnya yang kita inginkan adalah indeks yang akan dituju semua elemen. Untungnya ini ternyata adalah pemetaan dari nilai kembali ke daftar indeks asli, yang dengan sendirinya dapat dianggap sebagai hasil dari penyortiran kelas, sehingga memungkinkan kita untuk mengambil nilai kelas untuk mencapai hasil yang diinginkan.sumber
Pyth,
109 byte1 byte berkat Jakube.
Suite uji.
Ada harus menjadi cara yang lebih pendek ...
sumber
xL
bukannyasxR
. Atau apakah saya mengabaikan sesuatu?Racket, 117 byte
Saya selalu kecewa dengan kurangnya builtin untuk ini.
sumber
Ruby,
5453 byteCobalah online
-1 byte dari memutakhirkan ke pendekatan @ Downgoat menggunakan hash untuk menyimpan nilai alih-alih menghitung duplikat setiap kali.
sumber
Clojure, 83 byte
Saya membuat fungsi anonim yang menilai array input dan mengulanginya dua kali pada input. Panggilan pertama akan mengembalikan nilai. Panggilan kedua beroperasi pada tingkat dan mengembalikan peringkat.
sumber
Brachylog , 27 byte
Cobalah online! atau verifikasi semua kasus uji .
Penjelasan
Ini adalah implementasi langsung dari hubungan berikut: setiap bilangan bulat dari output yang sesuai dengan elemen input adalah indeks elemen tersebut dalam input yang diurutkan.
sumber
Mathematica, 15 byte
sumber
Mathematica, 135 byte
sumber
Common Lisp, 117 byte
Terapkan transformasi Schwartzian dua kali.
Uji
sumber
JavaScript (menggunakan perpustakaan eksternal) (105 byte)
Tautan ke lib: https://github.com/mvegh1/Enumerable Penjelasan kode: Buat metode anonim yang menerima daftar bilangan bulat. _.Dari menciptakan instance perpustakaan yang membungkus array dengan metode khusus. Pilih peta setiap item ke item baru, dengan mengambil alue "v", parsing ke string, lalu gabungkan "i" ndex dari item itu (ini memecahkan kasus nilai duplikat). Itu disimpan dalam variabel 'a'. Kemudian kami mengembalikan hasil dari yang berikut: Memetakan setiap item dalam 'a' ke indeks item dalam versi yang diurutkan dari (sebagai bilangan bulat), dan melemparkan kembali ke array JS asli
Perhatikan bahwa angka duplikat negatif tampaknya dicetak dalam urutan terbalik. Saya tidak yakin apakah itu membatalkan solusi ini? Secara teknis 8,10,4, -1, -1,8 harus 3,5,2,0,1,4 menurut OP tetapi kode saya mencetak 3,5,2,1,0,4 yang saya percaya adalah masih secara teknis valid?
sumber
GNU Core Utils,
3933 byteMenghasilkan output berbasis 1. Tambahkan
-v0
setelah yang keduanl
untuk mendapatkan output berbasis 0. (+4 byte)Perintah yang kami gunakan:
nl
menambahkan nomor baris ke setiap baris input.sort -n -k 2
urutkan berdasarkan kolom 2 secara numerik.cut -f 1
mengambil kolom pertama yang dibatasi Tab, membuang sisanya.Selain itu,
-s
opsi dapat diteruskan kesort
untuk meminta jenis yang stabil, tetapi kami tidak membutuhkannya di sini. Jika dua item identik,sort
akan menentukan urutannya dengan kembali ke kolom lain, yang dalam hal ini adalah output yang meningkat secara monotonnl
. Jadi pengurutannya akan stabil tanpa perlu menentukannya, berdasarkan input.sumber
Java
149140 byteGolf
Terima kasih kepada @Kevin Cruissjen untuk cukur 9 byte.
sumber
int[] a
danint[] b
. Anda dapat mengambilint
keluar dari loop. Dan karena Anda menggunakanb.length
dua kali di awal Anda bisa meletakkannya di bidang yang terpisah. Jadi secara total seperti ini:int[]a(int[]b){int l=b.length,o[]=new int[l],i,j;for(i=-1;++i<l;)for(j=-1;++i<b.length;)if(b[i]==Arrays.sort(b.clone())[j])o[i]=j;return o;}
( 140 byte ) Hmm, juga, sepertinya tidak berfungsi ..Arrays.sort(...)
tidak mengembalikan apa-apa (inivoid
metode), jadi bagaimana Anda dapat membandingkannya denganb[i]
...PHP, 88 byte
beroperasi pada argumen baris perintah; mencetak daftar yang diindeks, dipisahkan dengan garis bawah. Jalankan dengan
-nr
.kerusakan
sumber
MATLAB, 29 byte
Sebagian besar bawaan sortir MATLAB akan mengembalikan array kedua opsional yang berisi indeks yang diurutkan. The
j=
bisa dihapus jika mencetak indeks diterima, daripada kembali mereka.sumber
CJam , 19 byte
Cobalah online!
Penjelasan:
sumber