Tulis fungsi yang mengambil daftar atau larik, dan mengembalikan daftar elemen yang berbeda, diurutkan dalam urutan menurun berdasarkan frekuensi.
Contoh:
Diberikan:
["John","Doe","Dick","Harry","Harry","Doe","Doe","Harry","Doe","John"]
Nilai pengembalian yang diharapkan:
["Doe","Harry","John","Dick"]
Jawaban:
APL (14)
Ini adalah fungsi yang mengambil daftar, misalnya:
Penjelasan:
∘.≡⍨⍵
: bandingkan setiap elemen dalam array dengan setiap elemen lain dalam array, memberikan matriks+⌿
: jumlah kolom dari matriks, memberikan berapa kali setiap elemen terjadi⍒
: berikan indeks sortir ke bawah⍵[
...]
: menyusun ulang⍵
berdasarkan indeks yang diberikan∪
: dapatkan elemen uniksumber
Python 3 -
4743; Python 2 -4039Untuk Python 3:
Untuk Python 2:
Demo:
sumber
f=lambda n:sorted(set(n),cmp,n.count,1)
39 karaktercmp
fungsi non-Tidak ada dankey
fungsi. Keren.f=lambda n:sorted(set(n),key=n.count)[::-1]
Mathematica, 31
(Dengan
n = {"John", "Doe", "Dick", "Harry", "Harry", "Doe", "Doe", "Harry", "Doe", "John"}
)sumber
Reverse
, tetapiSort[GatherBy@n][[-1;;1, 1]]
tidak berhasil :). Ada ide?Mathematica (26
37)Dengan
n = {"John", "Doe", "Dick", "Harry", "Harry", "Doe", "Doe", "Harry", "Doe", "John"}
:Mathematica V10 + (26) :
sumber
Perl 6 (36 byte, 35 karakter)
»
dapat diganti dengan>>
, jika Anda tidak dapat menangani UTF-8. Saya hampir yakin ini bisa lebih pendek, tetapiBag
kelasnya relatif aneh dalam perilakunya (sayangnya), dan tidak benar-benar lengkap, karena relatif baru (tetapi dapat menghitung argumen).{}
mendeklarasikan fungsi anonim.Output sampel (dari Perl 6 REPL):
sumber
Ruby: 34
37karakter(diedit: solusi 30-char sebelumnya adalah fungsi dari body)
sumber
f=->a{a.sort_by{|z|-a.count(z)}&a}
. The&
tidak uniq.GolfScript, 14 karakter (19 sebagai fungsi fungsi, juga 14 sebagai program penuh)
Kode ini mengambil array pada stack dan mengurutkan elemen uniknya dalam urutan menurun berdasarkan jumlah kemunculannya. Misalnya, jika array input adalah:
maka array output akan menjadi
Catatan: Kode di atas adalah urutan pernyataan. Untuk mengubahnya menjadi fungsi bernama, bungkus dengan tanda kurung dan berikan ke nama, seperti pada:
Atau, untuk mengubah kode menjadi program lengkap yang membaca daftar dari input standar (menggunakan notasi daftar yang ditunjukkan di atas) dan mencetaknya ke output standar, tambahkan
~
dan tambahkan`
kode tersebut. The[.
dapat dihilangkan dalam kasus ini (karena kita tahu akan ada apa-apa lagi di tumpukan), sehingga program 14-karakter yang dihasilkan akan:Bagaimana cara kerjanya?
:a
menyimpan salinan array asli dalam variabela
untuk digunakan nanti..|
menghitung penyatuan array dengan sendirinya, menghilangkan duplikat sebagai efek samping.{ }$
mengurutkan array de-duplikat menggunakan tombol pengurutan khusus yang dihitung oleh kode di dalam kurung kurawal. Kode ini mengambil setiap elemen array, menggunakan pengurangan array untuk menghapusnya dari input array asli yang disimpana
, dan menghitung jumlah elemen yang tersisa. Dengan demikian, elemen diurutkan dalam urutan frekuensi yang menurun.Ps. Lihat di sini untuk versi 30 karakter aslinya.
sumber
[a\])^
harus setara dengan[.;]a\-
. Mengurutkan berdasarkan jumlah elemen yang tidak cocok adalah ide bagus.^
kolaps duplikat,-
tidak. (Dan ITYM(
, tidak)
.)[a\](\-
Akan berfungsi, tetapi tidak akan menyimpan karakter apa pun.R: 23 karakter
Tetapi ia menggunakan jalan pintas yang tidak begitu bagus
T
untukTRUE
...sumber
jika ini bisa muat di sini:
In sql-server
ATAU
melihatnya dalam aksi
sumber
select name from #t1 group by name order by count(*) desc
PHP,
63 6261 karakterDemo:
sumber
array_count_values()
... Itu saja yang harus Anda gunakan (termasukarsort()
)array_count_values()
tidak menghapus nilai duplikat, atau memesannya, seperti yang saya lihat.array_count_values
lebih lama?<?$u=array_count_values($_GET);arsort($u);print_r($u);
menurut sayaRuby: 59 karakter
Contoh dijalankan:
sumber
Mathematica, 39 karakter
sumber
JavaScript (ECMAScript5):
118113 karakterhttp://jsfiddle.net/mblase75/crg5B/
sumber
f=n=>{m={};n.forEach(e=>m[e]=m[e]+1||1);return Object.keys(m).sort((a,b)=>m[b]-m[a])}
. (Saat ini hanya di Firefox.)m[n[i]]=-~m[n[i]]
untuk menambah, dan Anda tidak perlu {} di sekitar badan loop.Haskell - 53 Karakter
Penjelasan: dua baris pertama adalah impor yang diperlukan, baris kode berikutnya adalah tipe tanda tangan (umumnya tidak diperlukan), fungsi sebenarnya adalah baris terakhir. Fungsi mengurutkan daftar berdasarkan urutan alami, mengelompokkan elemen yang sama ke dalam daftar, mengurutkan daftar dengan mengurangi ukuran, dan mengambil elemen pertama dalam setiap daftar.
panjang total termasuk impor: 120
tanpa impor tetapi dengan jenis tanda tangan: 86
fungsinya sendiri: 53
sumber
Clojure: 43 karakter
Fungsi:
Demo (dalam balasan):
sumber
Perl
untuk memenuhi spesifikasi i / o tertentu, saya perlu 120 karakter
kode terpendek murni dengan mengambil satu item per baris dan mencetak satu item per baris saya hanya perlu 55 karakter
sumber
C #: 111 karakter
(di dalam kelas)
Solusi sederhana menggunakan LINQ.
sumber
R (22)
Sebagai fungsi itu akan membutuhkan 11 karakter lagi.
Pemakaian:
sumber
Scala (71)
Tidak Disatukan:
sumber
J, 8 byte
Pemakaian
Nama-nama disimpan sebagai array dari string kotak.
Penjelasan
sumber
CJam, 15 byte (mungkin tidak bersaing)
Ini dapat menggunakan fitur CJam dari setelah tantangan ini diposting. Aku terlalu malas untuk memeriksanya.
sumber