Dengan asumsi A = 1, B = 2 ... Z = 26, dan nilai kata adalah jumlah dari nilai-nilai huruf ini, dimungkinkan untuk membagi beberapa kata menjadi dua bagian sehingga mereka memiliki nilai yang sama.
Misalnya, "wordsplit" dapat dipecah menjadi dua bagian seperti: ordsl wpit, karena o + r + d + s + l = w + p + i + t.
Ini adalah tantangan yang diberikan kepada kami oleh guru komputer saya - ini adalah tantangan lama Lionhead Studios. Saya telah menyelesaikannya dengan Python, dan akan segera mengirimkan jawaban saya.
Tantangan: Program terpendek yang dapat membuat daftar semua kemungkinan split yang memiliki skor sama. Perhatikan bahwa hanya perlu mencantumkan satu untuk setiap grup huruf - ordsl wpit sama dengan rdosl wtip, misalnya. Lebih mudah untuk mendaftar mereka dalam urutan mereka datang dalam kata.
Bonus:
- Jika Anda menyorot pasangan di mana kedua kata tersebut adalah kata-kata bahasa Inggris yang valid (atau permutasi beberapa huruf), gunakan daftar kata dari beberapa jenis. (Ini bisa dilakukan dengan menempatkan tanda bintang di sebelah masing-masing atau beberapa metode lain, tetapi jelaskan.)
- Menambahkan opsi untuk menghapus duplikat (ini seharusnya tidak menjadi default.)
- Mendukung lebih dari dua perpecahan, misalnya tiga, empat atau bahkan perpecahan n-arah.
Jawaban:
Perl, 115
118123Jalankan dengan
perl -nE '<code goes here>'
. Itu 'n' dihitung dalam ukuran kode.Dipindahkan:
Dengan komentar dan nama variabel:
Beberapa trik yang digunakan:
1..1<<@_
mencakup rentang bit yang sama dengan0..(1<<@_)-1
, tetapi lebih pendek. (perhatikan bahwa mempertimbangkan masalah dari jauh, termasuk batas rentang beberapa kali tidak akan menghasilkan output yang salah)64-ord$_[$_]
bukannya menambahkanord$_[$_]-64
kemenangan karakter yang tidak terlihat: karena diakhiri dengan pembatas, itu membuat ruang sebelumfor
tidak perlu.cond ? var1 : var2 = new_value
.&&
dan||
digunakan sebagai pengganti kondisi yang tepat.$l-$r
lebih pendek dari$l!=$r
sumber
J (109)
Output untuk
wordsplit
:Penjelasan:
1!:1[1
: baca baris dari stdin([{~(i.@!A.i.)@#)
: dapatkan semua permutasi"1
: untuk setiap permutasi:(96-~a.&i.)
: dapatkan skor surat}.@(split~&.>i.@#@>)@<
: pisahkan setiap permutasi dari skor di setiap ruang yang mungkin, kecuali sebelum yang pertama dan setelah angka terakhir>(>@(=/@:(+/"1&>)&.>)#[)
: lihat permutasi mana yang memiliki belahan yang cocok dan pilih ini{&a.@(96&+)&.>
: kembalikan skor menjadi huruf~.(/:{[)
: hapus variasi sepele (mis.ordsl wpit
danordsl wpti
)sumber
{a,bc}
sudah ditemukan, untuk menghapus{a,cb}
tetapi tidak menghapus{bc,a}
. (Dan tentu saja saya tidak tersinggung, jika saya benar-benar / telah menggandakan jawaban seseorang, saya lebih suka jika seseorang menunjukkannya.)c99 - 379 karakter yang diperlukan
Pendekatannya cukup jelas. Ada fungsi yang menjumlahkan kata berdasarkan topeng dan fungsi yang mencetaknya juga berdasarkan topeng. Masukan dari input standar. Satu keanehan adalah bahwa rutinitas pencetakan menyisipkan spasi untuk huruf yang tidak ada dalam topeng. Tab digunakan untuk memisahkan grup.
Saya tidak melakukan satu pun item bonus, juga tidak mudah dikonversi untuk mendukungnya.
Dapat dibaca dan dikomentari:
Validasi
sumber
Ruby: 125 karakter
Contoh dijalankan:
sumber
Mathematica
123111Menemukan semua himpunan bagian dari kata yang memiliki 1/2 "total ascii" dari kata
d
,. Kemudian temukan pelengkap dari himpunan bagian tersebut.d = "WORDSPLIT"
sumber
J, 66 karakter
Menggunakan digit angka base2 untuk memilih setiap subset yang mungkin.
sumber
Solusi saya ada di bawah ini. Ini hampir anti-golf dalam ukurannya, tetapi ini bekerja dengan sangat baik. Ini mendukung pemisahan n-way (meskipun waktu komputasi menjadi sangat lama untuk lebih dari sekitar 3 splits) dan mendukung penghapusan duplikat.
Output sampel:
sumber
Lua - 195
input harus dalam huruf besar:
sumber
Python - 127
dan di sini Versi n-split dengan 182 byte tanpa duplikat:
Masukan misalnya:
sumber