Menurut halaman ini , strategi terbaik untuk menebak kata-kata algojo Inggris adalah dengan menghitung peluang setiap huruf dalam daftar kata yang memenuhi persyaratan kami. Tetapi, karena saya benar-benar malas, saya tidak benar-benar ingin menghitung setiap kata dalam kamus sendiri. Tapi, seperti yang saya tahu bahwa Anda selalu di sini untuk membantu saya, saya yakin Anda akan dapat membuat saya menjadi raja kode yang akan melakukan itu untuk saya. Dan, karena hard disk saya hampir penuh, saya ingin kode sekecil mungkin. Ini berarti bahwa ini adalah kode-golf, dan pengiriman dengan jumlah byte terendah akan menang, tetapi juga yang paling akurat! .
Input output
Kata acak dari daftar kata ini akan diambil.
Program Anda harus menerima, dalam argumen, atau dengan input pengguna (sembulan, stdin, apa pun),
- Panjang kata
- Surat yang salah sudah ditemukan, atau 0 jika kami baru saja memulai permainan, dan Anda tidak memberikan surat yang salah.
- Surat sudah ditemukan DAN posisi mereka dalam kata
Contoh: ./hangsolver 6 XBZ 1P 4P 2E 6E
Di sini, saya memilih kata "orang". Untuk kejelasan: PE _ P _ E (Huruf yang salah adalah XB dan Z)
Itu artinya, dalam satu pertandingan, saya harus meluncurkan skrip Anda berkali-kali!
Output akan menjadi satu huruf, percobaan Anda berikutnya.
Aturan
- Salah satu yang akan menebak 10 kata dalam percobaan kurang dari yang lain akan menang.
- Dalam kasus seri, kode terpendek dalam byte menang.
- Jika masih ada seri, program tercepat akan menang.
- Anda dapat berasumsi bahwa hanya ada kata - kata ini dalam bahasa Inggris
- Saya hanya akan mencoba kata-kata yang valid dari daftar kata.
- Saya memiliki komputer yang bagus, kekuatan CPU tidak akan menjadi masalah (tetapi cobalah untuk menjawab secepat mungkin!)
- Anda tidak dapat menyelesaikan dengan solver online, tetapi Anda dapat mengunduh daftar kata, atau membiarkannya sebagai argumen. Anda dapat menganggap itu akan dinamai "wordlist.txt" dan di direktori yang sama dengan skrip Anda.
- Kode Anda harus dapat dijalankan pada OS umum. Itu bisa windows, mac, atau ubuntu / debian / CentOS atau Redhat.
- Anda tidak dapat menggunakan pemecah eksternal.
- Namun Anda dapat mempersingkat URL ke daftar kata.
- Golf kode ini akan berakhir pada awal September.
- Anda HARUS menggunakan metode yang dijelaskan di atas.
Semoga berhasil !
Daftar kata ditemukan di sini di SE.
sumber
Jawaban:
PowerShell,
248246241 byteTidak disatukan
Yah, sebanyak yang saya bisa tanpa mengubah cara kerjanya:
Kerusakan
Pendekatan yang saya ambil di sini adalah pertama-tama menghasilkan ekspresi reguler untuk mengeluarkan kata-kata yang mungkin keluar dari daftar kata. Karena saya tahu panjangnya kata, dan huruf-huruf yang tidak berfungsi, saya bisa membuat regex dengan mudah.
Jadi dalam contoh ORANG, 6 huruf dengan XBZ tidak menjadi bagian dari kata, saya akan mencari untuk menghasilkan
^PE[^XBZ]P[^XBZ]E$
.Saya mengeksploitasi fakta bahwa
Get-Content
(gc
) mengembalikan array garis, dan-match
operator ketika digunakan dengan array di sisi kiri, mengembalikan array yang cocok bukan bool, jadi saya bisa dengan cepat mendapatkan daftar kata-kata yang kandidat, begitu saya memiliki regex.Untuk menghasilkan regex, saya mulai dengan array (
$e
) dari kelas karakter pencocokan negatif dengan$c
elemen ($c
menjadi jumlah huruf dalam kata). Iterasi melalui angka 1 sampai$c
, saya memeriksa surat yang cocok di posisi itu, dan jika ada, saya mengganti elemen$e
dengan huruf itu.Setelah saya mengulangi semua posisi, array terakhir adalah
-join
ed (dengan string kosong) dan kami memiliki regex kami.Jadi sekarang saya punya berbagai kata yang mungkin. Cepat
-join
dengan string kosong di atasnya, beri saya satu string besar bersambung dari semua kata, saya pisah\B
(bukan batas kata, jika saya pisah pada string kosong saya akan mendapatkan 2 elemen kosong tambahan), jadi sekarang saya memiliki array dari setiap huruf di setiap kata yang mungkin.Memipipkannya ke dalam
Where-Object
memungkinkan saya menyaring surat-surat yang sudah cocok. Bagian ini benar-benar menyakitkan. Itu harus berurusan dengan daftar huruf yang cocok (yang termasuk posisi) menjadi 1 elemen, lebih dari 1 elemen, atau 0 elemen, karenanya memaksa$b
ke dalam array terlebih dahulu sehingga-match
dapat beroperasi pada mereka semua, tetapi itu (sayangnya dalam hal ini ) mengembalikan array, jadi kita harus memeriksa.Count
. Menggunakan!(thing).Count
sedikit lebih kecil dari menggunakan(thing).Count-gt0
.Selanjutnya, sekarang kita punya array semua karakter tunggal (
string
tidakchar
s sebagai s) dari semua kata itu mungkin, minus huruf yang sudah dapat ditebak dengan benar.Memipakan yang
Group-Object
memberi saya objek dengan jumlah setiap huruf, jadi pipa cepat keSort-Object count
membuatnya mudah untuk mendapatkan jumlah tertinggi. Daripada(thing|sort count -des)[0]
kita bisa menggunakan(thing|sort count)[-1]
. Di PowerShell[-1]
mendapatkan elemen terakhir. Pada titik ini kita masih berurusan dengan objek yang berasalGroup-Object
sehingga kita mendapatkan.Name
properti yang merupakan huruf yang paling banyak muncul.Catatan
wordlist.txt
yang bisa mencukur beberapa byte..\hangman.ps1 7 0
Laju paling lambat yang bisa saya lakukan ( ) berjalan sekitar 350ms.sumber
Python3, 299 Bytes
cukup yakin ini bisa bermain golf lebih lanjut.
Memfilter daftar kata untuk pencocokan potensial, membuat peta frekuensi karakter, dan memilih karakter yang paling sering muncul yang belum diambil.
sumber
''.join(..)
. Jika semua elemen di dalamnya adalah string dengan panjang 1, Anda dapat mengubahnya ke'..'[2::5]
, di mana apostrof adalah backticks.Java,
646640631607606 (pendek)790789779 (cepat) bytePENDEK
CEPAT
Masukkan file daftar kata ke dalam folder.
Algoritma versi pendek
p[i] == q[i] || q[i] == '\0'
mana p adalah kata dari daftar kata (array char), dan q adalah kata yang kami coba tebakAlgoritma versi panjang
sumber
PHP, 346 byte
Ia bekerja sebagai berikut:
Asumsi:
>=5.4
wordlist.txt
file di folder saat inisumber
php hangman.php 6 YH 2E 6E 3O 1P 4P PHP Notice: Undefined offset: 2 in ./Desktop/hangman.php on line 1 Notice: Undefined offset: 2 in ./Desktop/hangman.php on line 1
Mencoba membuatnya menebak orangPowershell, 153 byte
Terinspirasi oleh jawaban briantist .
Sebagai penulis lain saya menggunakan nama file
wordlist.txt
. Meskipun dimungkinkan untuk memilih nama yang lebih pendek.Skrip uji yang kurang golf:
Keluaran:
Nilai variabel untuk
&$f 7 0 2o,5e,7t
:sumber