Kata majemuk adalah kata yang mengandung 2 atau lebih kata di dalamnya. Kita bisa melakukan lebih baik dari itu. Kami membutuhkan Anda untuk membuat 1 kata (tidak masuk akal) yang berisi setiap kata .
Namun, kami ingin kata ini sesingkat mungkin. Kita dapat menggunakan huruf yang tumpang tindih untuk mencapai ini.
Misalnya, jika daftar kata Anda adalah ["cat", "atom", "a"]
, Anda ingin kembali "catom"
.
Input output
Program Anda perlu mengambil daftar kata sebagai input, dan mengembalikan kata majemuk sebagai output.
Daftar kata yang akan Anda gunakan adalah 10.000 kata teratas dalam bahasa Inggris, menurut Google (Jika daftar ini ternyata terlalu mudah, saya dapat mengubahnya menjadi lebih panjang). Sebagai referensi, cukup menambahkan setiap kata memberi Anda skor 65888.
Skor Anda adalah jumlah huruf dalam kata akhir Anda, lebih rendah lebih baik. Tie breaker menuju ke poster pertama.
sumber
Jawaban:
C ++, panjang kata terakhir: 38272
(versi yang dioptimalkan memakan waktu sekitar 20 menit)
Verifikasi bash satu baris:
Itu juga menghasilkan beberapa kata dalam proses yang cukup keren. Inilah beberapa favorit saya:
Dan:
Hasil akhirnya adalah pastebin di sini: http://pastebin.com/j3qYb65b
sumber
max_word_length - overlap(word[i], word[j])
(di manaoverlap
memeriksa tumpang tindih dari kanan argumen pertama di sebelah kiri yang kedua). Memecahkan ini (semoga berhasil!) Kemudian memotong loop yang dihasilkan dengan biaya tertinggi (tumpang tindih terendah) akan memberikan daftar kata yang terurut yang dapat digabungkan untuk memberikan solusi yang optimal.C ++ 11, 38272 huruf, terbukti optimal
Algoritma ini dijamin untuk memberikan batas bawah pada solusi. Dalam hal ini, ia mampu mencapai batas bawah dan menghasilkan solusi 38272 huruf yang optimal. (Ini cocok dengan solusi yang ditemukan oleh algoritma serakah Dave. Saya terkejut dan sedikit kecewa menemukan bahwa itu optimal, tetapi, di sinilah kita.)
Ia bekerja dengan memecahkan masalah aliran biaya minimum pada jaringan yang dibangun sebagai berikut.
Setiap string dengan panjang n yang berisi setiap kata dapat dikonversi menjadi aliran di jaringan ini dengan biaya paling banyak n . Oleh karena itu, aliran biaya minimum pada jaringan ini adalah batas bawah pada panjang string tersingkat tersebut.
Jika kita beruntung — dan dalam hal ini kita adalah — maka setelah kita mengarahkan kembali aliran ke w _1 kembali dari w _0, kita akan menemukan aliran optimal yang hanya memiliki satu komponen yang terhubung dan yang melewati node untuk kosong tali. Jika demikian, ini akan berisi sirkuit Euler mulai dan berakhir di sana. Sirkuit Euler seperti itu dapat dibaca kembali sebagai string dengan panjang optimal.
Jika kita tidak beruntung, tambahkan beberapa busur tambahan antara string kosong dan string terpendek di komponen yang terhubung lainnya untuk memastikan bahwa ada sirkuit Euler. String tidak lagi optimal dalam hal ini.
Saya menggunakan perpustakaan LEMON untuk aliran min-cost dan algoritma sirkuit Eulerian. (Ini adalah pertama kalinya saya menggunakan perpustakaan ini, dan saya terkesan — saya pasti akan menggunakannya lagi untuk kebutuhan algoritma grafik di masa depan.) LEMON hadir dengan empat algoritma aliran biaya minimum yang berbeda; Anda bisa mencobanya di sini dengan
--net
,--cost
,--cap
, dan--cycle
(default).Program berjalan dalam 0,5 detik , menghasilkan string keluaran ini .
sumber
Java 8, ~ 5 Menit, Panjang 39.279
Memasukkan:
Keluaran:
sumber
26,609
karakter.Python 2, 39254 karakter
Butuh 1-2 menit untuk berjalan di mesin saya, bekerja dengan mengambil kata terpanjang dan kemudian selalu menambahkan kata ke string hasil yang memiliki string paling umum. (Sebelum itu semua kata yang merupakan substring dari kata lain dihapus untuk mencegah penambahan yang tidak perlu ke string.)
Pembaruan: Mencoba melihat ke dua arah, tetapi itu tidak lebih baik. (mungkin menggunakan kata-kata yang bisa digunakan lebih baik nanti?)
Tautan ke kata di pastebin.
100 karakter pertama:
Kode:
sumber
Ruby, 39222 karakter
Menggunakan pendekatan yang mirip dengan @KarlKastor dalam jawaban Python-nya, tetapi string awal adalah salah satu kata terkecil dan bukan yang terbesar. Pengoptimalan lain (saya tidak tahu seberapa besar manfaatnya) adalah bahwa di antara setiap penambahan, ia memangkas setiap kata yang mungkin telah dimasukkan dalam string karena kata-kata yang tumpang tindih.
Berjalan dalam waktu kurang lebih 4 menit pada mesin saya, tidak termasuk permintaan web untuk mengambil daftar kata-kata, tetapi tidak cukup 4:20.
Kata di Pastebin.
sumber
PowerShell v2 +, 46152 karakter
Mengambil input sebagai daftar, melemparkannya ke dalam ArrayList (jadi kita dapat memanipulasinya). Kami
sort
denganlength
di-des
cending rangka. Kemudian,while
kita masih memiliki kata-kata dalam larik input kita, lakukan perulangan. Setiap iterasi, atur helper$x
menjadi sama dengan berapa banyak yang tersisa, tempelkan item berikutnya dalam daftar ke output kita$o
, dan kemudian tarik semua yang masih ada dalam daftar kita. Jika.IndexOf
tidak sama dengan-1
(yaitu, kata itu ditemukan di suatu tempat di$o
), kami menghapus kata itu dari daftar kata yang tersisa. Akhirnya, pada akhirnya, output$o
.Saya tidak memiliki akses ke Pastebin atau yang serupa, jadi inilah awal dan akhir kata untuk sementara -
telecommunicationscharacterizationresponsibilitiessublimedirectory...fcmxvtwvfxwujmjsuhjjrxjdbkdxqc
. Yang saya kira telah mencukur sekitar 20.000 karakter dari input, jadi tidak terlalu buruk, saya kira.Saya sedang mengerjakan perbaikan.
sumber
PHP 46612 karakter
Ini baru permulaan. Saya berharap untuk memperbaikinya. Yang saya lakukan sejauh ini adalah menghapus kata apa pun yang merupakan sub-string dari kata lain. Saya sedang mengerjakan 3 salinan array, tetapi memori sepertinya tidak menjadi masalah.
sumber