Tantangan ini adalah untuk menulis fungsi minimax dalam bahasa pilihan Anda, untuk menghasilkan langkah terbaik berikutnya dalam permainan NxN dari tic-tac-toe yang diberikan status papan saat ini . Input papan dapat diterima sebagai Matriks, Koleksi 2D atau apa pun yang masuk akal bagi Anda, tetapi mematuhi aturan . Keluaran menjadi langkah terbaik berikutnya untuk siapa pun giliran saat ini , di mana X dianggap telah dimulai .
Latar Belakang Cepat pada Algoritma Minimax
Ide dasar dari algoritma minimax adalah untuk menghitung semua hasil yang mungkin sebagai DAG kemudian membobotnya dengan manfaat bahwa urutan gerakan harus ke pemain, dikunci oleh langkah pertama yang dibuat. Semua hasil yang mungkin kemudian 'tertekuk' oleh langkah pertama, dan diberi skor berdasarkan jumlah semua hasil (-1 untuk kekalahan, 0 untuk dasi dan 1 untuk menang). Dalam implementasi yang membutuhkan banyak pemain untuk bermain, Anda menghitung semua gerakan yang mungkin dilakukan oleh pemain, dan semua respons yang mungkin dilakukan oleh lawan juga. Misalnya, dalam permainan tic-tac-toe (setelah langkah pertama) ada 8 gerakan pertama yang bisa Anda buat, dan semuanya mungkin tampak sama ketika hanya menganalisis belokan berikutnya. Tetapi dengan mengulangi semua hasil yang mungkin untuk setiap rangkaian gerakan yang memungkinkan yang menghasilkan hasil akhir dan merangkum semuanya,
Untuk ringkasan yang lebih baik, lebih mendalam dan kontekstual dari algoritma mini-max dalam hal tic-tac-toe, baca lebih lanjut di sini: http://neverstopbuilding.com/minimax
XKCD (3x3 Solusi Saja)
Aturan
- Bahasa apa pun dapat digunakan, tetapi tidak ada perpustakaan minimax eksternal yang diizinkan.
- Output dapat berupa koordinat (0-n, 0-n) atau angka (1-n * n) yang mengindikasikan langkah terbaik berikutnya.
- Selain itu, Anda harus dapat mengidentifikasi kapan skenario kasus terbaik adalah kekalahan atau seri alih-alih menang.
- Cara Anda menyatakan kehilangan atau dasi adalah, sekali lagi, terserah Anda.
- Input harus menggunakan X dan O tradisional, dan Anda harus menganggap X bergerak terlebih dahulu; ruang kosong dapat diwakili oleh apa pun.
- Anda dapat mengasumsikan input apa pun yang masuk ke program Anda memiliki nO dan n + 1 X, dengan kata lain Anda mungkin menganggap Anda mendapatkan papan yang dibentuk dengan baik.
- Keadaan dewan saat ini harus menjadi satu-satunya input untuk program Anda, jika Anda menggunakan rekursi, metode pembantu harus dibuat untuk memfasilitasi persyaratan input. Lihat /codegolf//a/92851/59376 untuk klarifikasi.
- Nilai 10> = n> = 1 harus didukung; jika program Anda "time out" untuk n> 10, saya menemukan ini dapat diterima juga, karena beberapa bahasa memiliki kekuatan pemrosesan yang jauh lebih rendah (Terutama menggunakan konsol yang menghadap web).
Menilai
- Ini adalah kode-golf, sehingga byte-count terendah dari program menang dan celah standar tidak diizinkan secara universal.
- Dalam kasus seri, program yang mendukung 'n' terbesar akan menang.
Contoh Input
2x2
[[X,O]
[-,-]]
Output: 2 atau [0,1] (3 atau [1,1] juga bisa dibilang benar) (Beberapa bentuk indikasi lokasi, sewenang-wenang selama Anda dapat dengan mudah menjelaskan format yang Anda gunakan)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
Output: -1 (Kerugian)
Sekali lagi format input apa pun yang Anda inginkan diizinkan, tetapi X dan O harus digunakan, contoh yang diberikan tidak dimaksudkan untuk membatasi format itu, hanya untuk menginspirasi.