Karena saya tidak dapat berkonsentrasi pada tugas apa pun selama lebih dari 5 detik, saya sering menemukan diri saya memecah kata menjadi sub-string, yang masing-masing memiliki panjang yang berbeda dan tidak mengandung karakter yang berulang. Misalnya, kata "pasta" mungkin dipecah menjadi "masa lalu" & "a", "pas" & "ta", atau "pa" & "sta" dan Anda mendapatkan gambarnya.
Namun, karena mengingat semua kombinasi itu sulit, saya biasanya hanya memilih satu, dan saya suka memilih yang terbaik. Kami menganggap cara terbaik untuk menjadi yang memiliki "skor" terendah. Tugas Anda akan, diberi kata, untuk mencetak skornya, diberi aturan rumit berikut.
Mencetak gol
Deskripsi cara mencetak kata:
Sebuah kata adalah rangkaian karakter Latin, huruf besar harus diganti dengan 2 dari huruf kecil yang sama (jadi "Kotak" menjadi "bbox")
Segmen adalah substring berdekatan (ketat) dari sebuah kata, dan tidak boleh mengandung karakter dua kali ("dia", "re", "h" semua segmen yang valid dari "Di sini" ("di sini"), tetapi "hh" dan "ere" tidak)
Segmentasi adalah seperangkat segmen dengan panjang berbeda yang, ketika digabungkan, membentuk kata asli ("tre" dan "e" membuat "pohon"), dan yang tidak dapat lagi disegmentasi dalam segmentasi (yaitu "ba" memiliki satu segmentasi, "ba"; dan "alp" & "habet" bukan segmentasi yang valid dari "alfabet", karena salah satu dari ini dapat disegmentasi lebih lanjut (misalnya menjadi "a" & "lp" & "habet", yang sekarang segmentasi yang valid ("habet" tidak dapat disegmentasi tanpa membentuk segmen dengan panjang 2 atau 1)))).
Skor segmentasi adalah jumlah skor masing-masing karakter berbeda yang muncul dalam kata asli (setelah huruf kapital diganti)
Skor karakter dijelaskan di bawah ini
Skor sebuah kata adalah skor dari segmentasi terbaik yang mungkin (dengan skor terendah)
Jika tidak ada segmentasi yang valid untuk sebuah kata (misalnya, "Kuningan" ("bbrass"), yang tidak dapat disegmentasi karena "b" dan "s" terakhir harus di segmen mereka sendiri, yang akan menghasilkan dalam dua segmen dengan panjang yang sama), maka Anda harus menampilkan teks "jahat", jika tidak, Anda harus menampilkan skor kata.
Penilaian karakter
Skor karakter didasarkan pada berapa kali karakter muncul, dan bobot segmen yang muncul masuk. Bobot segmen tergantung pada panjang segmen, dan kelipatan umum terendah dari panjang semua segmen di segmentasi.
segment weighting = lowest common multiple of lengths segments / length of segment
Pertimbangkan kata "zaitun", yang dapat disegmentasi sebagai "ol" & "ive", dan divisualisasikan sebagai 2 kotak dari area yang sama, satu "ol" dengan berat 3, dan satu "ive" dengan berat 2 (LCM dari 6).
ol
ol ive
ol ive
Ini dimaksudkan untuk menggambarkan dua kotak, satu terbuat dari 3 "ol", dan satu terbuat dari 2 "ive". Atau, mungkin "o" & "hidup" (LCM dari 4)
o
o
o
o live
Skor masing-masing karakter adalah jumlah dari bobot segmen di mana ia muncul, dikalikan dengan jumlah kali itu muncul setelah mengganti huruf besar (jadi jika itu muncul dua kali, Anda akan dikenakan biaya dua kali lipat untuk setiap kali Anda harus mengatakannya ).
character score = character count * sum(segment weights in which character appears)
Contoh pemberian skor
Kami mengambil kata "jatuh", itu hanya dapat dibagi menjadi "fal" dan "l". Kelipatan umum terendah 3 dan 1 adalah 3, jadi "fal" memiliki bobot 1, dan "l" memiliki berat 3.
l
l
fal l
Melewati setiap karakter ...
"f" muncul satu kali, dan berada di segmen "fal" dengan bobot 1, sehingga memiliki skor 1 * 1 = 1
"a" juga muncul hanya sekali, memiliki jumlah bobot 1, sehingga memiliki skor 1 * 1 = 1
"l" muncul dua kali, dan muncul di "fal" (bobot 1) dan "l" (bobot 3), sehingga memiliki skor 2 * (1 + 3) = 8
Jumlahnya adalah 10 (skor segmentasi, dan kata, karena ini adalah segmentasi terbaik). Berikut ini dalam format yang sama dengan contoh di bawah ini:
fall = fal l
2*1 [fa] + 2*(1+3) [ll] = 10
Contoh Penilaian
Contoh-contoh penilaian ini mungkin atau mungkin tidak membantu:
class -> clas s
3*1 [cla] + 2*(4+1) [ss] = 13
fish -> fis h
3*1 [fis] + 1*3 [h] = 6
eye -> e ye
1*1 [y] + 2*(1+2) [ee] = 7
treasure -> treas u re
3*2 [tas] + 2*2*(2+5) [rree] + 1*10 [u] = 44
Wolf -> w wolf
3*1 [olf] + 2*(1+4) = 13
book
evil
"buku" adalah kata yang jahat, jadi tidak ada nilainya.
Perhatikan bahwa "harta" dapat tersegmentasi dalam beberapa cara, tetapi segmentasi menunjukkan manfaat dari memiliki huruf yang lebih sering ("r" dan "e") di segmen yang lebih panjang, sehingga mereka tidak memiliki bobot lebih banyak. Segmentasi "t" & "re" & "asure" akan memberikan hasil yang sama, sedangkan "harta" & "ur" & "e" akan menderita, dengan "e" memiliki skor 2 * (1 + 10 + 2 ) = 24 dengan sendirinya. Pengamatan ini benar-benar semangat dari seluruh latihan. Contoh skor "harta" yang salah (salah karena tidak berasal dari skor segmentasi terbaik (yang dengan skor terendah)):
treasure = treas ur e
3*2 [tas] + 2*(2+5) [rr] + 1*5 [u] + 2*[2+10] = 49
Memasukkan
Satu string yang hanya berisi karakter latin dari kedua case ("horse", "Horse", dan "hOrSe" adalah semua input yang valid) yang dapat diterima baik oleh STDIN, argumen baris perintah, argumen fungsi, atau sebaliknya jika bahasa Anda dari Pilihan tidak mendukung salah satu dari yang disebutkan di atas.
Keluaran
Anda harus menampilkan skor kata, yang merupakan bilangan bulat positif tunggal lebih besar dari 0, atau "jahat" jika tidak ada segmentasi. Outputnya harus STDOUT atau argumen pengembalian fungsi, kecuali bahasa pilihan Anda tidak mendukung keduanya, dalam hal ini melakukan sesuatu dengan sportif.
Contohnya
Saya tidak mengharapkan Anda untuk mencetak semua hal ini, yang saya inginkan hanyalah skor kata, atau output "jahat", misalnya (input diikuti oleh output)
eye
7
Eel
evil
a
1
Establishments
595
antidisestablishmentarianism
8557
Saya tidak peduli dengan kinerja, jika Anda dapat mencetak hampir setiap kata 15letter (setelah mengganti huruf kapital) dalam waktu kurang dari satu menit pada mesin yang masuk akal (sengaja dibiarkan kabur), itu cukup baik bagi saya.
Ini kode-golf, semoga kode terpendek menang.
Terima kasih kepada PeterTaylor, MartinBüttner, dan SP3000 untuk bantuan mereka dengan tantangan ini