Ini kembali ke musim sekolah! Jadi untuk pekerjaan paruh waktu, Anda membantu di perpustakaan sekolah. Masalahnya adalah, kepala perpustakaan bahkan belum pernah mendengar kata-kata "Dewey Decimal," apalagi menerapkan sistem itu. Sebagai gantinya, sistem penyortiran yang digunakan telah tumbuh "organik" karena perpustakaan telah berkembang ...
Dalam upaya menjaga kewarasan Anda, Anda telah memilih untuk menulis sebuah program untuk membantu Anda menyortir buku ketika dikembalikan, karena celakalah Anda jika Anda salah mengurutkan buku. (Pustakawan kepala SANGAT ketat.)
Input output
- Masukan akan berupa daftar judul buku (hipotetis), satu judul per baris, dari STDIN / padanan bahasa.
- Anda dapat mengasumsikan tidak lebih dari 100 input buku sekaligus (Anda hanya dapat membawa begitu banyak perpustakaan sekaligus).
- Buku dapat memiliki beberapa kata dalam judulnya, dan kata-kata ini dapat dipisahkan dengan spasi atau tanda baca lainnya (misalnya, tanda titik dua
:
, tanda hubung-
, dll.). - Untuk kemudahan perhitungan, anggap semua judul adalah UTF-8.
Output adalah judul yang sama, disortir menurut aturan di bawah ini, sekali lagi satu per baris, ke STDOUT / bahasa yang setara.
Aturan Penyortiran
Buku diurutkan secara numerik berdasarkan nilai karakter rata-rata mereka (yaitu, nilai karakter kumulatif membagi jumlah karakter dalam judul buku), dihitung dengan aturan berikut:
- Semua karakter dihitung untuk menentukan jumlah karakter dalam suatu judul.
- Huruf kecil dihitung berdasarkan posisinya dalam alfabet. (a = 1, b = 2, ... z = 26)
- Jika judul berisi huruf kapital, yang dihitung sebesar 1,5 nilai huruf kecilnya (A = 1,5, B = 3, ... Z = 39). ("Huruf kapital penting!" Kata pustakawan itu.)
- Setiap tanda baca / simbol dalam daftar ini
!@#$%^&*()-=_+[]\{}|;':",./<>?~
dihitung -1 dari nilai kumulatif sebelum rata-rata. ("Gelar muluk tidak!") - Jika judul berisi angka, ditulis dalam angka Arab , angka itu dikurangi dari nilai rata-rata sebelum disortir. Beberapa digit berurutan diperlakukan sebagai satu angka (misalnya,
42
akan mengurangi 42, tidak mengurangi 4 dan kemudian mengurangi 2). Digit individu tidak dihitung untuk nilai kumulatif (yaitu, setiap digit berkontribusi 0), tetapi DO menghitung jumlah karakter. Perhatikan bahwa ini dapat menghasilkan nilai negatif dan harus diperlakukan dengan tepat. (Rumor mengatakan, pustakawan naksir instruktur matematika selama beberapa tahun, sekarang.) - Jika judul berisi dua kata terpisah yang dimulai dengan
R
, buku mendapat skor "tak terbatas" dan dibuang ke tumpukan di sudut (yaitu, diatur secara acak di akhir daftar). (Pustakawan itu pernah dibuang oleh seseorang dengan inisial itu, atau begitulah yang Anda dengar.) - Spasi tidak dihitung untuk nilai karakter kumulatif (yaitu, mereka berkontribusi 0), tetapi DO berkontribusi pada jumlah karakter dalam judul.
- Karakter yang tidak sesuai dengan aturan di atas (misalnya, a
ÿ
) tidak dihitung untuk nilai karakter kumulatif (yaitu, mereka berkontribusi 0), tetapi DO berkontribusi pada jumlah karakter dalam judul. - Sebagai contoh, sebuah buku hipotetis
ÿÿÿÿÿ
akan memiliki "skor"(0+0+0+0+0) / 5 = 0
, tetapi sebuah buku hipotetisÿÿyÿÿ
akan memiliki "skor"(0+0+25+0+0) / 5 = 5
. - Dua buku yang kebetulan "mencetak" yang sama dapat menjadi Output dalam pilihan pesanan Anda. (Lagi pula, mereka berada di rak yang sama)
Contoh Input 1
War and Peace
Reading Rainbow: The Best Unicorn Ever
Maus
Home for a Bunny
Contoh Output 1 (dengan "skor" dalam tanda kurung untuk menunjukkan alasan - Anda tidak perlu mencetaknya)
War and Peace (8.5)
Home for a Bunny (10.125)
Maus (15.125)
Reading Rainbow: The Best Unicorn Ever (infinity)
Contoh Input 2
Matthew
Mark
Luke
John
Revelations
Contoh Output 2 (dengan "skor" dalam tanda kurung untuk menunjukkan alasan - Anda tidak perlu mencetaknya)
Mark (12.375)
John (13)
Revelations (13.545454...)
Luke (13.75)
Matthew (~13.786)
Contoh Input 3
42
9 Kings
1:8
7th
Contoh Output 3 (dengan "skor" dalam tanda kurung untuk menunjukkan alasan - Anda tidak perlu mencetaknya)
42 (-42)
1:8 (-9.3333...)
9 Kings (~0.36)
7th (2.3333...)
Pembatasan lainnya
- Ini adalah Code-Golf, karena Anda harus menjaga rahasia program dari mata pustakawan yang selalu menonton, dan semakin kecil programnya, semakin mudah disembunyikan.
- Batasan celah standar berlaku
- Jangan biarkan pustakawan menangkap Anda malas dengan menghabiskan seluruh waktu Anda di PPCG.
Jawaban:
APL (132)
Karena semua orang melakukan hal yang sama, ini juga adalah fungsi yang mengambil array judul dan mengembalikannya diurutkan, misalnya:
Penjelasan:
⎕ML←3
: setel⎕ML
ke3
(untuk⊂
)⍵[⍋{
...}¨⍵]
: urutkan input berdasarkan nilai yang dikembalikan dari fungsi dalam↑¨⍵⊂⍨⍵≠' '
: dapatkan karakter pertama dari setiap kata2='R'+.=
: lihat apakah dua di antaranya'R'
.:!99
: jika demikian, kembalikan 99! (≈ 9.3 × 10 155 ). Ini bukan tak terhingga, tetapi ia akan berhasil: sebuah judul tidak akan pernah bisa memiliki skor lebih dari 38 kali panjangnya (ZZZZ ...), jadi selama tidak ada judul tunggal yang lebih besar dari sekitar 2 × 10 130 yottabytes, itu dijamin bahwa ini akan menjadi pada akhirnya.⋄
: jika tidak:(
...)÷⍴⍵
: bagi skor dengan panjang⍵
setelah menghitungnya:G←(⊂⎕A),(⎕UCS 96+⍳26)
: simpan dalamG
huruf besar dan kecil(⎕UCS 32+⍳94)~'`',⎕D,∊G
: karakter ASCII yang dapat dicetak, kecuali huruf, angka, spasi dan'`'
, yang merupakan karakter yang titiknya dikurangkan. (Ini lebih pendek daripada menulis semuanya, karenaG
digunakan nanti.)+/⍵∊
: hitung jumlah karakter ini di⍵
-
: kurangi ini dari:+/∊1.5 1×(⍳×∊⍨)∘⍵¨G
: jumlah 1,5 × skor untuk ibukota, dan 1 × skor untuk huruf kecil.-⍨
: setelah itu, kurangi total angka dalam⍵
:⍵⊂⍨⍵∊⎕D
: temukan grup digit di⍵
'0',
: add'0'
, untuk mencegah daftar kosong⍎¨
: mengevaluasi setiap string+/
: temukan jumlahnyasumber
!99
Anda bisa menggunakan⌊/⍬
Lua 5.3,
366364 BytesKode ini hanya berfungsi di Lua 5.3 karena harus berurusan dengan karakter Unicode. Jika Anda tidak peduli tentang Unicode, maka ganti "utf8" dengan "string" dan itu akan berfungsi dengan baik dengan Lua 5.2 atau 5.1.
Dibutuhkan input dari argumen baris perintah, jadi jalankan dari baris perintah atau letakkan kode ini di atas jawaban saya:
sumber
utf8
denganstring
di Ideone dan tidak mendapat hasil.(arg)
sedang duduk di sana menatap wajahku. Pertanyaan ini rupanya menggoreng otak saya. Punya +1.Mathematica,
253216 byte (214 karakter)Panggil fungsi seperti
f[{"42", "9 Kings", "1:8", "7th"}]
; itu akan mengembalikan daftar input yang diurutkan.Baru saja berhasil! Pencocokan pola Mathematica tidak sesingkat ketika string terlibat, dan saya baru saja terbunuh oleh nama-nama panjang itu. Dua byte tambahan adalah untuk
Infinity
karakter unicode.(Beri tahu saya jika saya telah berselisih dengan Celah Standar.)
Memperbarui
Melihat sedikit lebih dekat pada jawaban edc65, sepertinya OP akan menerima fungsi yang mengurutkan daftar string. Dengan mengingat hal itu, kita dapat menggunakan bentuk kari
SortBy
(yang Mathematica menyebutnya "bentuk operator"); dengan satu argumen (fungsi diterapkan ke elemen daftar untuk menentukan urutannya) berperilaku seperti fungsi yang mengambil satu argumen, mengembalikan bentuk input yang diurutkan; yaituSortBy[list, f]
setara dengan(SortBy[f])[list]
.Tidak disatukan
sumber
JavaScript (ES6), 210
218 251Sebagai fungsi dengan argumen array, kembali diurutkan.
sumber
O.innerHTML
kethis.InnerHTML
di konsol Firefox.C #,
352349 BytesKarena keajaiban LINQ:
Bisa menyimpan 6 byte lagi jika backtick akan dimasukkan dalam daftar tanda baca!
sumber
Pergi, 755 Bytes
Versi yang diformat:
Menerapkan antarmuka pengurutan khusus membuatnya lebih lama dari yang diharapkan. Program membaca dari STDIN sampai akhir input atau baris kosong dimasukkan.
sumber
PHP, 362
367BytesVersi yang diformat:
Garis yang menarik:
Mengonversi satu karakter UTF-8 ke nilai byte dan menjumlahkannya, sehingga kami mendapatkan nilai nyata untuk karakter ASCII dan nilai yang lebih tinggi dari 127 untuk karakter multibyte.
Memanfaatkan operator yang lebih rendah dari
and
danor
untuk menetapkan nilai karakter dalam satu pernyataan tanpaif
.sumber
Perl 5 , 190 byte
Cobalah online!
sumber