Saya memiliki gembok kombinasi yang memiliki huruf dan bukan angka. Kelihatannya seperti ini: http://pictures.picpedia.com/2012/09/Word_Combination_Padlock.jpg Ada 5 gulungan, masing-masing memiliki 10 huruf berbeda.
Kebanyakan orang lebih suka menggunakan kata untuk kombinasi mereka daripada serangkaian huruf acak. (Kurang aman, tentu saja, tetapi lebih mudah diingat.) Jadi ketika membuat kuncinya, akan lebih baik untuk membuatnya dengan kombinasi huruf yang dapat digunakan untuk membuat kata-kata bahasa Inggris sebanyak 5 huruf sebanyak mungkin.
Tugas Anda, jika Anda memilih untuk menerimanya, adalah menemukan tugas surat untuk gulungan yang akan memungkinkan kata-kata sebanyak mungkin dibuat. Misalnya, solusi Anda mungkin
ABCDEFGHIJ DEFGHIJKLM ZYXWVUTSR ABCDEFGHIJ ABCDEFGHIJ
(Jika Anda tidak merasa terlalu imajinatif, itu adalah).
Untuk konsistensi, silakan gunakan daftar kata di http://www.cs.duke.edu/~ola/ap/linuxwords
Kata 5 huruf apa pun dalam daftar itu OK, termasuk nama yang benar. Abaikan Sino- dan L'vov dan kata-kata lain dalam daftar yang berisi karakter bukan az.
Program yang menang adalah program yang menghasilkan serangkaian kata terbesar. Jika beberapa program menemukan hasil yang sama, yang pertama diposting akan menang. Program harus berjalan dalam waktu kurang dari 5 menit.
Sunting: karena aktivitas telah mereda, dan tidak ada solusi yang lebih baik telah keluar, saya menyatakan Peter Taylor pemenang! Terima kasih semuanya atas solusi inventif Anda.
sumber
Jawaban:
1275 kata oleh pendakian sederhana serakah bukit
Kode adalah C #. Solusi yang dihasilkan adalah
Saya menggunakan format output itu karena sangat mudah untuk menguji:
sumber
Main
metode untuk memanggil_Main
metode yang berbeda .Python (3), 1273 ≈ 30,5%
Ini adalah pendekatan yang benar-benar naif: pertahankan frekuensi dari setiap huruf di setiap posisi, lalu hilangkan huruf "terburuk" hingga huruf-huruf yang tersisa sesuai dengan gulungan. Saya terkejut tampaknya melakukannya dengan sangat baik.
Yang paling menarik adalah bahwa saya memiliki output yang hampir sama persis dengan solusi C # 1275, kecuali saya memiliki
N
pada reel terakhir saya, bukanA
. ItuA
adalah eliminasi ke-11 saya yang terakhir, juga, bahkan sebelum membuang aV
dan aG
.Menghasilkan:
sumber
Mathematica , 1275 kata lagi dan lagi ...
Kode ini tidak di-Golf-kan karena pertanyaannya sepertinya tidak perlu.
Kata menghitung dengan cepat (kurang dari 10 detik) berevolusi menjadi 1275 pada kebanyakan berjalan tetapi tidak pernah melampaui itu. Saya mencoba mengganggu surat-surat oleh lebih dari satu pada suatu waktu dalam upaya untuk keluar dari maksimum lokal teoritis tetapi tidak pernah membantu. Saya sangat curiga bahwa 1275 adalah batas untuk daftar kata yang diberikan. Ini adalah langkah lengkapnya:
Berikut beberapa pilihan "menang":
Seperti komentar Peter, ini sebenarnya solusi yang sama dalam urutan berbeda. Diurutkan:
sumber
shortlist
terasa panjang, dan meskipun ini bukan Golf, saya ingin sesuatu yang lebih pendek. Bisakah kamu menolong?Python, 1210 kata (~ 29%)
Dengan asumsi saya menghitung kata-kata dengan benar kali ini, ini sedikit lebih baik daripada solusi FakeRainBrigand. Satu-satunya perbedaan adalah saya menambahkan setiap gulungan secara berurutan, dan kemudian menghapus semua kata dari daftar yang tidak cocok dengan gulungan sehingga saya mendapatkan distribusi yang sedikit lebih baik untuk gulungan berikutnya. Karena ini, ia memberikan gulungan pertama yang sama persis.
Output program
sumber
iPython (
273210 Bytes, 1115 kata)1115/4176 * ~ 27%
Saya menghitung ini di iPython, tetapi riwayat saya (dipangkas untuk menghapus debugging) tampak seperti ini.
Jika kita akan kekurangan; Saya bisa memotongnya menjadi ini.
Dipersingkat:
Hasil saya adalah:
['sbcapfdtmg', 'aoeirulhnt', 'aironeluts', 'etnlriaosc', 'seyrdtnlah']
.* Matematika saya di 4176 mungkin sedikit pendek karena kata-kata dengan tanda hubung atau tanda kutip dihilangkan
sumber
Q
? (todo) kata-kata
Kata-kata harus disimpan dalam file bernama
words
Berjalan sekitar 170 ms pada i7 saya. Ini menganalisis daftar kata, mencari surat paling umum di setiap posisi (jelas menyaring non-kandidat). Ini adalah solusi naif malas tetapi menghasilkan hasil yang cukup baik dengan kode minimal.
Hasil:
sumber
Sunting: Sekarang setelah aturannya diubah, pendekatan ini didiskualifikasi. Saya akan meninggalkannya di sini kalau-kalau ada yang tertarik sampai saya akhirnya memodifikasinya untuk aturan baru.
Python: 277 Karakter
Saya cukup yakin bahwa versi umum dari masalah ini adalah NP-Hard, dan pertanyaannya tidak memerlukan menemukan solusi tercepat , jadi inilah metode brute-force untuk melakukannya:
Perhatikan bahwa saya mengganti nama file daftar kata menjadi "w" untuk menyimpan beberapa karakter.
Outputnya adalah jumlah kata yang dimungkinkan dari konfigurasi yang diberikan diikuti oleh konfigurasi itu sendiri:
Garis keluaran terakhir sebelum program berakhir dijamin menjadi solusi optimal.
sumber