Skrip Stack Exchange menentukan lima komentar pada pertanyaan atau jawaban yang pada awalnya terlihat di halaman utama situs melalui jumlah upvote pada mereka; lima komentar dengan jumlah suara terbanyak ditampilkan. Tugas Anda adalah menciptakan kembali perilaku ini.
Tulis program lengkap atau fungsi yang mengambil input melalui STDIN, argumen baris perintah, atau argumen fungsi dan mencetak atau mengembalikan lima skor komentar teratas. Input akan berupa array bilangan bulat yang mewakili jumlah upvotes pada komentar beberapa posting. Misalnya, input dari
0, 2, 5, 4, 0, 1, 0
berarti bahwa komentar pertama tidak memiliki suara, yang kedua memiliki dua suara, yang ketiga memiliki lima, keempat memiliki empat, dll. Urutan skor komentar harus tetap sama dalam output.
Jika input berisi lima atau lebih sedikit skor komentar, maka output harus mengandung tidak lebih dari yang diberikan. Jika dua atau lebih skor komentar sama, skor pertama harus ditampilkan. Anda dapat mengasumsikan bahwa array input akan mengandung setidaknya satu skor komentar.
Angka-angka dalam output harus mudah dibedakan (jadi 02541 untuk kasus 1 tidak valid). Kalau tidak, tidak ada batasan pada format output; angka-angka dapat dipisahkan oleh spasi atau baris baru, atau mungkin dalam format daftar, dll.
Kasus uji:
[0, 2, 5, 4, 0, 1, 0] -> [0, 2, 5, 4, 1]
[2, 1, 1, 5, 3, 6] -> [2, 1, 5, 3, 6]
[0, 4, 5] -> [0, 4, 5]
[1, 1, 5, 1, 1, 5] -> [1, 1, 5, 1, 5]
[0, 2, 0, 0, 0, 0, 0, 0] -> [0, 2, 0, 0, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 0] -> [0, 0, 0, 0, 1]
[5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7] -> [5, 8, 7, 6, 7]
[6, 3, 2, 0, 69, 22, 0, 37, 0, 2, 1, 0, 0, 0, 5, 0, 1, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2] -> [6, 69, 22, 37, 5]
Contoh terakhir diambil dari pertanyaan Stack Overflow ini .
Jika memungkinkan, harap berikan tautan di pos Anda di mana kiriman Anda dapat dijalankan secara online.
Ini adalah kode golf, jadi kode terpendek dalam byte menang. Semoga berhasil!
Jawaban:
Jelly , 6 byte
Cobalah online! atau verifikasi semua kasus uji sekaligus .
Bagaimana itu bekerja
sumber
Python 2, 58 byte
Uji di Ideone .
Bagaimana itu bekerja
list.remove
menghapus kejadian pertama jika argumennya dari daftar yang ditentukan. Dengan membalik daftar x , kita pada dasarnya mencapai itu menghapus kejadian terakhir sebagai gantinya.Dengan demikian, cukup untuk terus menghapus komentar dengan jumlah upvotes minimal sampai daftar tidak lebih dari lima komentar tercapai. Setelah itu, kami membalikkan daftar sekali lagi untuk mengembalikan pesanan awal.
sumber
Pyth, 11 byte
Kami menghitung persimpangan multiset dari input (
Q
) dengan lima elemen terbesar diQ
(dalam urutan mereka munculQ
), kemudian mengambil lima pertama dari mereka.Coba di sini .
sumber
<5SQ
setara dengan<SQ_5
, yang menghemat 1 byte.b[:-a]
... Saya pikir itu bahkan mungkin pada titik tertentu.MATL , 16 byte
Ini menggunakan rilis saat ini (10.2.1) , yang lebih awal dari tantangan ini.
Cobalah online!
Penjelasan
sumber
JavaScript,
74 65 6261 byteOff 3 byte terima kasih @ user81655. 1 byte off terima kasih @apsillers.
Tampilkan cuplikan kode
sumber
Python 3, 76
Disimpan 9 byte berkat Kevin yang mengingatkan saya bahwa saya dapat menyalahgunakan jika pernyataan dalam daftar comp.
Disimpan 5 byte berkat DSM.
Solusi yang cukup sederhana saat ini. Raih 5 nilai teratas dan kemudian parsing melalui daftar menambahkannya ke hasil saat kami menemukannya.
Berikut ini adalah kasus pengujian saya jika ada yang menginginkannya:
sumber
05AB1E ,
1211 byteKode:
Penjelasan:
Menggunakan pengodean CP-1252.
sumber
CJam, 16 byte
Blok tanpa nama (fungsi) yang mengambil array dan mengembalikan array.
Suite uji.
Penjelasan
sumber
Utilitas Bash + GNU, 36
I / O diformat sebagai daftar yang dipisahkan oleh baris baru melalui STDIN / STDOUT.
Cobalah online.
sumber
Python, 68 byte
Contoh dijalankan.
Benjolan bawaan. Saya pikir cara terbaik untuk menjelaskan adalah dengan menjalankan contoh.
enumerate
mengubah daftar menjadi pasangan indeks / nilai (secara teknis sebuahenumerate
objek).Pasangan diurutkan berdasarkan nilai terbesar terlebih dahulu, menjaga urutan indeks saat ini untuk ikatan. Ini menempatkan di depan komentar dengan skor tertinggi, tiebroken oleh posting sebelumnya. Kemudian, 5 komentar terbaik diambil.
Masukkan lima komentar teratas kembali dalam urutan posting, dan kemudian hapus indeks, hanya menyimpan skor.
sumber
PowerShell v4,
12097 byteBereksperimen di sekitar, saya menemukan pendekatan alternatif yang bermain golf beberapa byte tambahan. Namun, tampaknya khusus untuk PowerShell v4 dan bagaimana versi itu menangani pengurutan hashtable - tampaknya, secara default, bahwa di v4 jika beberapa Nilai memiliki nilai yang sama, dibutuhkan versi dengan Kunci "lebih rendah", tetapi Anda tidak dijamin dalam v3 atau lebih awal, bahkan ketika menggunakan kata kunci yang dipesan di v3. Saya belum sepenuhnya memeriksa ini terhadap PowerShell v5 untuk mengatakan jika perilaku berlanjut.
Versi v4-only ini mengambil input sebagai
$a
, kemudian membuat hashtable kosong baru$b
. Kami mengulangi semua elemen input$a|%{...}
dan setiap iterasi menambahkan pasangan kunci / nilai$b
(dilakukan dengan pra-penambahan variabel pembantu$d
sebagai kunci untuk setiap iterasi). Kemudian kitasort
$b
berdasarkanValue
, makaselect
yang-l
ast5
, kemudiansort
olehName
(yaitu, kunci), dan akhirnya hanya output.Value
s dari hash yang dihasilkan.Jika kurang dari 5 elemen dimasukkan, itu hanya akan mengurutkan nilai, pilih lima terakhir (yaitu, semuanya), mengurutkan kembali pada kunci, dan output.
Lebih lama, 120 byte, berfungsi di versi sebelumnya
Algoritma yang sama dengan jawaban Morgan Thrapp , yang ternyata merupakan indikasi bahwa orang-orang hebat berpikir sama. :)
Mengambil input, memeriksa apakah jumlah item kurang dari atau sama dengan 5, dan jika demikian output input dan keluar. Jika tidak, kami membuat ArrayList
$b
(dengan para[System.Collections.ArrayList]
pemain panjang selangit ) dari lima elemen teratas$a
. Kami kemudian mengulangi$a
dan untuk setiap elemen jika ada di dalam$b
kami output dan kemudian menghapusnya$b
(dan inilah mengapa kita perlu menggunakan ArrayList, karena menghapus elemen dari Array bukanlah fitur yang didukung di PowerShell, karena mereka secara teknis diperbaiki ukuran).Membutuhkan v3 atau lebih tinggi untuk
-in
operator. Untuk jawaban yang bekerja di versi sebelumnya, pertukaran$_-in$b
untuk$b-contains$_
untuk total 126 byte .sumber
Haskell, 62 byte
Contoh penggunaan:
map snd.sort.take 5.sortOn((0-).snd).zip[0..] $ [5, 4, 2, 1, 0, 8, 7, 4, 6, 1, 0, 7]
->[5,8,7,6,7]
.Cara kerjanya: menambah setiap elemen dengan indeksnya, mengurutkan menurun, mengambil 5 elemen pertama, mengurutkan berdasarkan indeks dan menghapus indeks.
sumber
PHP 5,
107102Disimpan 5 byte berkat @WashingtonGuedes
Tidak disatukan
Cobalah.
sumber
1 1 5 1 1 5
, kiriman Anda menghasilkan output1 5 1 1 5
bukan yang benar1 1 5 1 5
.Ruby, 82
8789byte$><<eval($*[0]).map.with_index{|x,i|[i,x]}.sort_by{|x|-x[1]}[0,5].sort.map(&:last)
memanggil:
ruby test.rb [1,2,2,3,4,5]
pengiriman asli - 56 byte tetapi gagal pada kasus uji tertentu & tidak mendukung $ stdin dan $ stdout
_.reduce([]){|a,x|a+=_.sort.reverse[0..4]&[x]if !a[4];a}
Penjelasan
sumber
Java 7, 155 byte
Tidak digabungkan & kode uji:
Coba di sini.
Keluaran:
sumber
Julia, 48 byte
Cobalah online!
Bagaimana itu bekerja
Komentar c 1 memiliki prioritas lebih tinggi daripada komentar c 2 jika salah satu dari berikut ini benar:
Ini mendefinisikan urutan total komentar, dan tugas yang ada adalah menemukan lima komentar yang memiliki prioritas tertinggi.
Alih-alih mengurutkan komentar berdasarkan prioritas (yang akan mengubah urutannya, untuk setiap komentar c , kami menghitung komentar yang memiliki prioritas lebih besar atau sama. Kami tetap c jika dan hanya jika jumlah ini adalah 5 atau kurang.
Untuk mengurutkan komentar berdasarkan jumlah unduhan, kami melakukan hal berikut. Biarkan x menjadi vektor kolom yang berisi jumlah suara. Kemudian
x'
mentransposisi x - sehingga menciptakan vektor baris - danx.<x'
membuat matriks Boolean yang membandingkan setiap elemen x dengan setiap elemen x T .Untuk x = [0, 2, 5, 4, 0, 1, 0] , ini memberi
Dengan menjumlahkan seluruh baris (via
sum(...,2)
), kami menghitung jumlah komentar yang benar-benar lebih banyak upvotes daripada komentar pada indeks itu.Sebagai contoh vektor, ini memberi
Selanjutnya, kami menghitung jumlah komentar dengan jumlah upvotes yang sama telah diposting lebih awal dari komentar itu. Kami mencapai ini sebagai berikut.
Pertama kita membangun sebuah tabel kesetaraan dengan
x.==x'
yang compraes elemen x dengan unsur-unsur x T . Sebagai contoh vektor kita, ini memberikan:Selanjutnya, kita gunakan
cumsum
untuk menghitung jumlah kumulatif dari setiap kolom dari matriks.Diagonal (
diag
) memiliki jumlah komentar yang memiliki jumlah upvotes yang sama dan muncul paling lambat dari komentar yang sesuai.Dengan menambahkan dua vektor baris yang kami hasilkan, kami memperoleh prioritas ( 1 adalah yang tertinggi) dari komentar.
Komentar dengan prioritas mulai dari 1 hingga 5 harus ditampilkan, jadi kami menentukan indeksnya dengan
find(....<6)
dan mengambil komentar yang sesuai dengannyax[...]
.sumber
Python 3.5, 68 byte
Tidak cocok dengan jawaban Python 2 saya , tetapi hanya tiga byte lebih panjang dari port ke Python 3, dan saya pikir itu cukup berbeda untuk menjadi menarik.
I / O dalam bentuk tuple. Mengujinya pada repl.it .
sumber