Latar Belakang
MENACE ( M esin E ducable N hendaknya A nd C Rosses E ngine) adalah mesin dangkal algoritma pembelajaran dasar untuk Noughts permainan dan Crosses, yang diciptakan oleh ilmuwan komputer Inggris Donald Michie pada 1960-an. Awalnya diterapkan dengan 304 kotak korek api, masing-masing dilabeli dengan posisi papan dan berisi manik-manik berwarna (dengan salah satu dari sembilan warna, mewakili kemungkinan gerakan). Michie menghitung bahwa 304 kotak korek api ini cukup untuk setiap kombinasi gerakan di papan tulis.
Semakin matematis di antara Anda mungkin menyadari bahwa sebenarnya ada 19.683 kemungkinan kombinasi Noughts, Crosses dan Blanks pada papan N&C; namun, dia menghitung cara untuk mengurangi angka ini (untuk mempercepat algoritme, dan kemungkinan mengurangi pada kotak korek api!). Pertama, ia menghapus semua gerakan yang tidak mungkin dilakukan, seperti:
-------
|X|0|X|
| |0| |
|X|X| |
-------
(dua noughts dan empat salib)
Selanjutnya, ia mengganti rotasi. Misalnya, jika di kotak korek api kita melihat:
-------
| |0|0|
|X| |X|
| |0| |
-------
kita bisa menggunakan kotak yang sama untuk
-------
| |X| |
|0| |0|
| |X|0|
-------
Oleh karena itu, manik-manik berwarna tersebut mewakili posisi relatif, bukan yang absolut. Misalnya, jika kami mengatakan bahwa manik merah berarti kiri atas, maka kami akan melihat gambar di bagian atas kotak dan melihat:
-------
| |0|0|
|X| |X|
| |0| |
-------
jadi kita akan tahu bahwa jika ini adalah papan, maka manik merah berarti:
-------
|R|0|0|
|X| |X|
| |0| |
-------
Tetapi jika ini adalah papan:
-------
| |X| |
|0| |0|
| |X|0|
-------
manik merah artinya
-------
| |X|R|
|0| |0|
| |X|0|
-------
Transformasi ini diterapkan untuk rotasi dan pembalik (di semua arah, termasuk diagonal). Sekali lagi, Anda hanya perlu menyimpan setiap kotak korek api dengan cara ini: jangan membuat kotak virtual terpisah untuk setiap transformasi!
Penyederhanaan lain yang dibuat Michie adalah memastikan komputer berjalan lebih dulu. Dengan cara ini, dia bisa menghapus semua gerakan tingkat pertama, menghilangkan sekitar seperlima dari kotak yang tersisa. Akhirnya, ia menghapus semua kotak yang mengakhiri permainan (karena tidak ada 'isi' atau langkah lebih lanjut diperlukan pada langkah-langkah ini).
Benar, sekarang ke algoritme itu sendiri (sangat sederhana):
- Pertama, tentukan apa yang mewakili warna manik-manik. Anda membutuhkan 9 warna untuk mewakili setiap ruang di papan tulis.
- Di awal permainan, masing-masing dari 304 kotak korek api berisi manik-manik. Sementara manik-manik berwarna acak (jadi duplikatnya baik-baik saja), manik-manik tersebut harus merupakan gerakan yang mungkin (jadi jika gambar status papan menggambarkan 'O' di kanan-tengah, maka Anda tidak dapat menggunakan manik yang mewakili tengah-tengah). Baik).
- Setiap kali giliran MENACE (X), cari kotak korek api dengan posisi papan saat ini (atau beberapa transformasi itu) dicetak di atasnya.
- Buka kotak korek api, dan pilih manik di sana secara acak.
- Temukan bagaimana status papan telah diubah untuk mendapatkan gambar pada kotak korek api (mis. Diputar 90 derajat berlawanan arah jarum jam). Kemudian, terapkan transformasi itu ke manik (mis. Kiri atas menjadi kiri-kiri).
- Tempatkan tanda X di kotak itu. Hapus manik yang dipilih dari kotak korek api. Jika kotak dibiarkan kosong sebagai hasilnya, masukkan tiga manik-manik acak (mungkin) ke dalam kotak, dan pilih salah satu dari mereka untuk dipindahkan.
- Ulangi 3-6 hingga game berakhir.
- Jika MENACE memenangkan permainan, kembali ke setiap kotak korek api yang diambil MENACE. Kemudian, telusuri kembali manik warna apa yang digunakannya pada gerakan itu. Masukkan dua warna manik ke dalam kotak (sehingga ada manik asli + satu lagi, sehingga meningkatkan kemungkinan MENACE membuat gerakan yang lain kali sampai ke posisi itu)
- Jika MENACE kehilangan permainan, jangan lakukan apa pun ( jangan ganti manik-manik yang dikeluarkannya).
- Jika MENACE membuat permainan, maka ganti manik yang digunakannya di setiap gerakannya, tetapi jangan menambahkan yang lain, sehingga Anda memiliki apa yang Anda mulai.
Ini membuat kita dengan algoritma yang sangat sederhana, tetapi sulit untuk diterapkan. Ini membentuk dasar dari tantangan Anda.
Jika Anda masih bingung, lihat http://chalkdustmagazine.com/features/menace-machine-educable-noughts-crosses-engine/ - itulah yang saya baca ketika saya pertama kali belajar tentang algoritma ini
Tantangan
Mainkan game Tic-Tac-Toe dengan komputer. Di setiap langkah, keluarkan konten semua kotak korek api.
Input
- Di awal program, ucapkan berapa banyak game yang ingin Anda mainkan melawan MENACE
- Kemudian, setelah giliran pertama MENACE, Anda memasukkan gerakan Anda sebagai string dua karakter, huruf pertama adalah "L", "R", atau "M" (kiri, kanan atau tengah) mengacu pada sumbu Y. Kemudian Anda memasukkan huruf lain (lagi, "L", "R", atau "M"), kali ini mengacu pada sumbu X. Ulangi untuk semua gerakan dan permainan.
Keluaran
- Pada awal setiap game baru, output "game baru".
- Setelah setiap gerakan oleh pemain, output papan dalam format yang masuk akal. Itu tidak perlu terlihat cantik (misalnya array array yang mewakili posisi papan baik-baik saja).
- Setelah setiap gerakan oleh pemain, MENACE harus bergerak. Keluarkan papan setelah gerakan MENACE
- Setelah setiap pertandingan, keluarkan konten dari semua 304 kotak korek api. Manik-manik dapat diwakili oleh huruf, nama warna, karakter atau string atau integer apa pun yang Anda suka (tidak ada pointer, fungsi anonim, dll).
Aturan
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
- Saya harus dapat memasukkan gerakan setelah melihat respons MENACE. Tidak 'serahkan semua gerakan Anda ke fungsi ini, dan saksikan bagaimana permainan dimainkan'.
- Papan harus dibersihkan di antara game.
- Kotak korek api tidak boleh dihapus di antara game (ini akan mengatur ulang pembelajaran mesin)
- Anda harus memiliki 304 kotak korek api. Siapa pun dapat menerapkan algoritme ini dengan semua 19.683 kotak korek api, tetapi pembelajarannya lambat (karena membutuhkan banyak permainan untuk mendapatkan semuanya dengan konten yang bermanfaat).
- Outputnya bisa dalam format apa pun yang masuk akal, dan input dapat diambil sesuai standar PPCG (asalkan sesuai dengan aturan 2). Jika Anda perlu menyesuaikan format input (seperti yang dijelaskan di bagian ' Input ') maka tidak apa-apa asalkan masuk akal.
- Sebuah permainan berakhir ketika seorang pemain menang (dengan mendapatkan tiga berturut-turut secara diagonal, horizontal atau vertikal) atau jika ada hasil seri (papan penuh dan tidak ada pemenang)
- Sementara MENACE perlu membuat gerakan yang mungkin (dan hanya memiliki manik-manik yang mungkin di dalam setiap kotak korek api), demi tantangan, Anda tidak perlu memvalidasi input pengguna. Jika mereka mengetik sesuatu yang salah, program Anda dapat melakukan apa saja (menjadi sangat gila, melempar kesalahan, dll.) - Anda dapat mengasumsikan bahwa inputnya benar.
sumber
[[0, 2, 6], [4, 8, 4, 3, 3], [7, 7, 7, 7, 7, 7, 7, 8], [1], ... [3, 3, 5, 4]]
.Jawaban:
R , 839 byte
Cobalah online!
Jawaban yang cukup panjang, tetapi ini bukan tantangan langsung. TIO link di sini akan gagal karena mengharapkan input interaktif. Berikut adalah versi yang dimainkan melawan pemain acak kedua yang hanya mengambil tempat secara acak. Output untuk versi kedua ini hanyalah pemenang (1, 2 atau 0 untuk seri.) Kotak korek api diinisialisasi untuk semua posisi papan, tetapi hanya digunakan untuk 304 per spec. Mereka diimplementasikan sebagai salinan papan dengan angka negatif untuk menunjukkan jumlah manik-manik di setiap posisi. Saya bereksperimen dengan daftar vektor per spesifikasi asli, tetapi kurang intuitif.
Ini adalah versi yang kurang golf dengan komentar (tapi masih nama variabel pendek). Perhatikan bahwa itu tidak mencetak kotak korek api karena sangat panjang. Itu dapat menerapkan pemain interaktif 2, pemain acak 2 atau strategi kotak korek api yang sama untuk pemain 2.
sumber