Tantangan ini adalah untuk menemukan rantai kata-kata bahasa Inggris terpanjang di mana 3 karakter pertama dari kata berikutnya cocok dengan 3 karakter terakhir dari kata terakhir. Anda akan menggunakan kamus umum yang tersedia di distribusi Linux yang dapat diunduh di sini:
https://www.dropbox.com/s/8tyzf94ps37tzp7/words?dl=0
yang memiliki 99171 kata bahasa Inggris. Jika Linux lokal Anda /usr/share/dict/words
adalah file yang sama (memiliki md5sum == cbbcded3dc3b61ad50c4e36f79c37084), Anda dapat menggunakannya.
Kata-kata hanya dapat digunakan satu kali dalam jawaban.
EDIT: Surat harus cocok persis termasuk huruf besar / kecil, apostrof, dan aksen.
Contoh dari jawaban yang valid adalah:
idea deadpan panoramic micra craftsman mantra traffic fiche
yang akan skor 8.
Jawaban dengan rantai kata terpanjang yang valid akan menjadi pemenang. Dalam hal seri, jawaban paling awal akan menang. Jawaban Anda harus mencantumkan rantai kata-kata yang Anda temukan dan (tentu saja) program yang Anda tulis untuk melakukannya.
sumber
Jawaban:
Java, heuristik mendukung vertex yang menginduksi grafik terbesar:
1825 18551873Kode di bawah ini berjalan dalam waktu kurang dari 10 menit dan menemukan jalur berikut:
Ide inti
Dalam Perkiraan jalur dan siklus terarah terpanjang , Bjorklund, Husfeldt, dan Khanna, Lecture Notes in Computer Science (2004), 222-233, penulis mengusulkan bahwa dalam grafik expander yang jarang, jalur panjang dapat ditemukan oleh pencarian serakah yang memilih masing-masing langkah tetangga dari ekor saat ini dari jalur yang membentang subgraf terbesar di G ', di mana G' adalah grafik asli dengan simpul di jalur saat ini dihapus. Saya tidak yakin dengan cara yang baik untuk menguji apakah suatu grafik adalah grafik expander, tapi kami jelas berhadapan dengan grafik yang jarang, dan karena intinya adalah sekitar 20.000 simpul dan memiliki diameter hanya 15, ia harus memiliki yang baik properti ekspansi. Jadi saya mengadopsi heuristik serakah ini.
Diberikan grafik
G(V, E)
, kita dapat menemukan berapa banyak simpul yang bisa dijangkau dari setiap simpul menggunakan Floyd-Warshall dalamTheta(V^3)
waktu, atau menggunakan algoritma Johnson dalamTheta(V^2 lg V + VE)
waktu. Namun, saya tahu bahwa kita sedang berhadapan dengan grafik yang memiliki komponen terhubung sangat besar (SCC), jadi saya mengambil pendekatan yang berbeda. Jika kami mengidentifikasi SCC menggunakan algoritma Tarjan maka kami juga mendapatkan semacam topologi untuk grafik terkompresiG_c(V_c, E_c)
, yang akan jauh lebih kecil, padaO(E)
waktunya. KarenaG_c
ini adalah DAG, kita dapat menghitung keterjangkauanG_c
dalamO(V_c^2 + E_c)
waktu. (Saya kemudian menemukan bahwa ini mengisyaratkan dalam latihan 26-2.8 dari CLR ).Karena faktor dominan dalam waktu berjalan adalah
E
, saya mengoptimalkannya dengan menyisipkan simpul dummy untuk awalan / sufiks. Jadi, alih-alih 151 * 64 = 9664 tepi dari kata-kata yang berakhir -res ke kata-kata mulai res- Saya memiliki 151 tepi dari kata-kata yang berakhir -res ke # res # dan 64 tepi dari # res # untuk kata-kata yang dimulai res- .Dan akhirnya, karena setiap pencarian memakan waktu sekitar 4 menit pada PC lama saya, saya mencoba untuk menggabungkan hasil dengan jalur panjang sebelumnya. Ini jauh lebih cepat, dan muncul solusi terbaik saya saat ini.
Kode
org/cheddarmonk/math/graph/Graph.java
:org/cheddarmonk/math/graph/MutableGraph.java
:org/cheddarmonk/math/graph/StronglyConnectedComponents.java
:org/cheddarmonk/ppcg/PPCG.java
:sumber
Ruby, 1701
"Del" -> "ersatz's"
( urutan penuh )Mencoba menemukan solusi optimal terbukti terlalu mahal dalam waktu. Jadi mengapa tidak memilih sampel acak, cache apa yang kita bisa dan berharap yang terbaik?
Pertama a
Hash
dibangun yang memetakan awalan ke dunia penuh dimulai dengan awalan itu (misalnya"the" => ["the", "them", "their", ...]
). Kemudian untuk setiap kata dalam daftar metodesequence
ini dipanggil. Ia mendapat kata-kata yang mungkin bisa diikuti dariHash
, mengambil sampel100
dan menyebut dirinya secara rekursif. Yang terpanjang diambil dan ditampilkan dengan bangga. Benih untuk RNG (Random::DEFAULT
) dan panjang urutan juga ditampilkan.Saya harus menjalankan program beberapa kali untuk mendapatkan hasil yang baik. Hasil khusus ini dihasilkan dengan biji
328678850348335483228838046308296635426328678850348335483228838046308296635426
.Naskah
sumber
0.0996
detik.Skor:
16311662 kataAnda dapat menemukan seluruh rangkaian di sini: http://pastebin.com/TfAvhP9X
Saya tidak memiliki kode sumber lengkap. Saya mencoba berbagai pendekatan. Tetapi di sini ada beberapa potongan kode, yang seharusnya dapat menghasilkan urutan dengan panjang yang sama. Maaf, itu tidak terlalu indah.
Kode (Python):
Pertama, beberapa preprocessing data.
Kemudian saya mendefinisikan fungsi rekursif (pencarian pertama Kedalaman).
Tentu saja ini terlalu lama. Tetapi setelah beberapa waktu ia menemukan urutan dengan 1090 elemen, dan saya berhenti.
Hal selanjutnya yang harus dilakukan, adalah pencarian lokal. Untuk setiap dua tetangga n1, n2 dalam urutan, saya mencoba mencari urutan mulai dari n1 dan berakhir di n2. Jika urutan seperti itu ada, saya masukkan.
Tentu saja saya juga harus menghentikan program secara manual.
sumber
PHP,
17421795Saya sudah mengacaukan PHP tentang hal ini. Triknya adalah menyisihkan daftar ke sekitar 20k yang sebenarnya valid, dan hanya membuang sisanya. Program saya melakukan ini secara iteratif (beberapa kata yang dibuang di iterasi pertama berarti yang lain tidak lagi valid) di awal.
Kode saya mengerikan, menggunakan sejumlah variabel global, menggunakan terlalu banyak memori (ia menyimpan salinan seluruh tabel awalan untuk setiap iterasi) dan butuh beberapa hari untuk menghasilkan yang terbaik saat ini, tetapi masih mengelola untuk menjadi pemenang - untuk saat ini. Ini dimulai dengan cukup cepat tetapi semakin lambat & lambat seiring berjalannya waktu.
Peningkatan yang jelas akan menggunakan kata yatim untuk awal & akhir.
Bagaimanapun, saya benar-benar tidak tahu mengapa daftar pastebin saya dipindahkan ke komentar di sini, itu kembali sebagai tautan ke pastebin karena saya sekarang sudah memasukkan kode saya.
http://pastebin.com/Mzs0XwjV
sumber
Python:
1702-1704- 1733 kataSaya menggunakan Dict untuk memetakan semua awalan ke semua kata, seperti
Edit sedikit peningkatan: menghapus semua
useless
kata di awal, jika sufiksnya tidak ada dalam daftar awalan (jelas akan menjadi kata akhir)Kemudian ambil satu kata dalam daftar dan ramban peta awalan seperti Node pohon
Program perlu sejumlah kata untuk mengetahui kapan berhenti, dapat ditemukan seperti
1733
dalam metode inicheckForNextWord̀
Program membutuhkan path file sebagai argumen
Tidak terlalu pythonic tetapi saya mencoba.
Butuh waktu kurang dari 2 menit untuk menghitung urutan ini: output penuh :
sumber
Nilai:
2495001001Ini kode saya:
Sunting: 1001:
http://pastebin.com/yN0eXKZm
Edit: 500:
sumber
Mathematica
14821655Sesuatu untuk memulai ...
Tautan adalah awalan persimpangan dan sufiks untuk kata-kata.
Tepi adalah semua tautan terarah dari satu kata ke kata lain:
Temukan jalur antara "memperbaiki" dan "semangat".
Hasil (1655 kata)
sumber
Python, 90
Pertama saya membersihkan daftar secara manual dengan menghapus semua
ini menghabiskan paling banyak 2 poin karena kata-kata itu hanya bisa di awal atau akhir rantai tetapi mengurangi daftar kata dengan 1/3 dan saya tidak harus berurusan dengan unicode.
Selanjutnya saya membuat daftar semua pra- dan sufiks, menemukan tumpang tindih dan membuang semua kata kecuali kedua pra- dan sufiks berada di set tumpang tindih. Sekali lagi, ini mengurangi paling banyak 2 poin dari skor maksimal yang dapat saya peroleh, tetapi mengurangi daftar kata menjadi sepertiga dari ukuran aslinya (coba jalankan algoritme Anda pada short_list untuk kemungkinan percepatan) dan kata-kata lainnya sangat terhubung (kecuali beberapa 3 kata-newsletter yang terhubung hanya untuk diri mereka sendiri). Faktanya, hampir semua kata dapat dicapai dari kata lain melalui jalur dengan rata-rata 4 tepi.
Saya menyimpan jumlah tautan dalam sebuah matriks adjacency yang menyederhanakan semua operasi dan memungkinkan saya melakukan hal-hal keren seperti melihat n langkah di depan atau menghitung siklus ... setidaknya secara teori, karena dibutuhkan sekitar 15 detik untuk menyelesaikan matriks yang sebenarnya tidak saya lakukan. ini selama pencarian. Alih-alih, saya mulai dengan awalan acak dan berjalan secara acak, baik memilih akhir yang seragam, mendukung yang sering terjadi (seperti '-ing') atau yang jarang terjadi.
Ketiga varian menyedot sama rata dan menghasilkan rantai dalam kisaran 20-40, tetapi setidaknya cepat. Sepertinya saya harus menambahkan rekursi.
Awalnya saya ingin mencoba sesuatu yang mirip dengan ini tetapi karena ini adalah grafik berarah dengan siklus, tidak ada algoritma standar untuk Penyortiran Topologis, Jalur Terpanjang, Jalur Euler Terluas atau Masalah Tukang Pos Cina bekerja tanpa modifikasi berat.
Dan hanya karena kelihatannya bagus, di sini adalah gambar dari matriks adjacency M, M ^ 2 dan M ^ infinity (infinity = 32, tidak berubah setelah itu) dengan putih = entri bukan nol
sumber