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
sumber
Jawaban:
Mathematica, 373 byte
Ini cukup lama ... dan juga agak naif. Ini mendefinisikan fungsi tanpa nama yang mengambil string dan mengembalikan skor. Dibutuhkan sekitar 1 detik untuk menangani
"Establishments"
, jadi itu masih dalam batas waktu. Saya punya versi yang sedikit lebih pendek yang digunakanCombinatorica`SetPartitions
, tetapi sudah butuh satu menit"Establishme"
.Ini adalah versi dengan spasi putih:
Saya mungkin menambahkan penjelasan yang lebih rinci nanti. Kode ini menggunakan solusi kedua dari jawaban ini untuk mendapatkan semua partisi dan solusi ini untuk memastikan mereka semua tersegmentasi secara maksimal.
sumber
Java 8,
15101485 byteIni adalah cara yang terlalu panjang. Combinatorics tidak pernah mudah di java. Pasti bisa disingkat sedikit. Telepon dengan
a(string)
. Ini menggunakan memori eksponensial dan algoritma waktu; jadi jangan berharap itu bekerja untuk input lama. Dibutuhkan sekitar setengah detik untuk diprosesEstablishments
. Itu crash dengan kehabisan memori kesalahan untukantidisestablishmentarianism
.Coba di sini
Diindentasi dengan penjelasan:
Ini juga sedikit menyalahgunakan obat generik untuk mengurangi jumlah byte. Saya cukup terkejut saya bisa mendapatkan semua itu untuk dikompilasi.
Terima kasih Ypnypn :)
sumber
i.put...
garis dan loop sementara; Saya pikirwhile(d!=0)
bisawhile(d>0)
; tidak perlunew ArrayList
pada akhirnya karenaArrays.asList
memberiArrayList
pula; dalam metode terakhir, Anda dapat mendefinisikanb
sebagai dataranList
.Arrays.asList
mengembalikan yang tidak dapat dimodifikasiArrayList
, jadi saya tidak dapat menggunakannya tanpa mendapatkanOperationNotSupportedException
.b
dapat berupa daftar sederhana, tetapic
perlu tetap aList<List<String>>
. Saya akan memeriksa untuk melihat apakahwhile(d>0)
bekerja besok.C # 679 Bytes
Solusi ini kira-kira didasarkan pada struktur implementasi pengujian awal saya, dan awalnya hanya menulis ulang golf, tapi kemudian saya sebaris semua fungsi, dan sekarang ini mengerikan. Ini cukup cepat, menyelesaikan perusahaan dalam waktu kurang dari satu detik. Ini adalah program lengkap yang menggunakan kata input sebagai parameter tunggal ARGV.
The
Main
metode dimulai dengan membuat salinan input dengan ibukota diganti. Ia kemudian memanggilS
, "solver", yang mengembalikan skor segmentasi tertentu (segmentasi pertama adalah bahwa dengan segmen tunggal yang merupakan keseluruhan kata). Ini kemudian mencetak "jahat" atau skor, tergantung pada skor."Solver" (
S
) melakukan semua hal yang menarik, dan pada awalnya dipecah menjadi 4 metode, yang digulung bersama. Ia bekerja dengan terlebih dahulu menilai segmentasi saat ini, membuat catatan apakah itu tidak valid (dan yang terpenting, apakah itu sangat tidak valid, kita tidak boleh mencoba untuk lebih jauh lagi segmentasi itu (untuk kinerja), melewatkan sisa perhitungan jika itu) . Kemudian, jika belum dilewati, ia membagi setiap segmen dalam segmentasi di mana saja ia dapat dipecah, dan menemukan skor terbaik dari semua ini (panggilan secara rekursifS
). Akhirnya, itu baik mengembalikan skor terbaik dari Segmen bawahan, selain itu skor sendiri, atau tidak valid jika segmentasi sendiri tidak valid.Kode dengan komentar:
sumber