Dalam permainan 15, dua pemain bergiliran memilih angka dari 1 hingga 9 (tanpa memilih nomor yang telah dipilih salah satu pemain). Seorang pemain menang jika dia memiliki tiga angka yang berjumlah hingga 15. Jika semua angka telah dipilih dan tidak ada kombinasi dari masing-masing pemain yang menambah hingga 15, maka permainan itu seri.
Tugas Anda adalah membangun fungsi yang mengambil status permainan 15 (diwakili dalam bentuk apa pun yang Anda suka) dan mengembalikan nomor yang akan dipindahkan berikutnya, yang akan bertindak sebagai AI untuk memainkan permainan dengan pemain lain. Anda dapat mengasumsikan bahwa posisinya legal (tidak ada pemain yang memiliki lebih dari satu angka lebih dari pemain lain, dan tidak ada pemain yang memiliki tiga angka yang menambahkan hingga 15).
AI harus sempurna - yaitu, jika diberi posisi menang, ia harus memaksakan kemenangan, dan jika diberi posisi tidak kalah (posisi di mana lawannya tidak memiliki strategi kemenangan), ia tidak boleh membiarkannya lawan untuk memberikannya posisi yang kalah (yang mungkin, karena 15 adalah permainan yang diselesaikan).
Kode terpendek menang.
(catatan: Saya akan menerima jawaban terpendek yang sekarang dan mengubahnya jika jawaban yang lebih pendek muncul.)
Jawaban:
GolfScript (
129 86 81 8575 karakter)Format input yang diharapkan: di
[[int int ...][int int ...]]
mana daftar pertama adalah nomor saya dan daftar kedua adalah nomor lawan saya. Untuk pengujian interaktif, tambahkan~N
ke akhir skrip dan berikan string dalam format itu: misHeuristik:
5
adalah satu-satunya nomor yang dapat berkontribusi untuk menang dalam 4 cara, jadi raih jika tersedia.Kerangka uji:
sumber
[5][3]
(harus mengembalikan 4 atau 8).9
- tetapi kemudian Anda tampaknya telah mengubah peraturan.4
atau8
?7
harus bekerja, jadi9
dapat diterima.Ruby,
330 315341 karakterSaya akan menahan detail untuk saat ini, tetapi katakanlah itu didasarkan pada algoritma optimal untuk masalah serupa yang telah diselesaikan juga dan algoritma optimalnya yang bekerja dengan baik di sini.
Asumsi telah dibuat - ini akan memilih gerakan buruk dalam situasi yang tidak dapat dihasilkan oleh algoritma ini bermain melawan pemain lain, hanya oleh dua pemain yang saling berhadapan.Input: array dua array string satu digit. Setiap array mewakili nilai yang diambil oleh satu pemain - yang pertama adalah AI, yang kedua adalah lawan.
Output: salah satu angka, atau string satu digit. Mereka setara secara semantik. Normalisasi ke string akan dikenakan biaya 8 karakter.
Tiga karakter lagi dapat disimpan jika kita mengasumsikan urutan angka yang diberikan oleh penelepon - ubah regex di L5 ke
/^285$/
atau/^258$/
tergantung pada urutan yang dihasilkan dari game(opponent)5-(ai)2-(opponent)8
.sumber
5
ke awal urutan preferensi Anda.GolfScript (
90 8584 karakter)Ini mengambil pendekatan yang sama sekali berbeda, tetapi berpotensi rentan terhadap optimisasi untuk mengalahkan yang heuristik. Di sini kita melakukan analisis pohon permainan penuh, sangat lambat. (Tidak, maksud saya. Diperlukan beberapa jam untuk menjalankan tes penuh, terutama karena
`{...}+
yang menambahkan status saat ini ke loop langkah berikutnya). Perhatikan bahwa bagian yang sulit adalah mengidentifikasi negara pemenang (sepertiga dari kode, saat ini).Ada beberapa peretasan jelek di bagian non-rekursif. Secara khusus, ketika posisi diidentifikasi sebagai posisi yang kalah, kami mengambil posisi kami sebagai
[value move]
susunan, bergantung pada langkah yang tidak relevan dan nilainya tidak-nol.sumber