Tulis program dalam bahasa pilihan Anda yang memainkan permainan tic-tac-toe di papan 3 * 3 melawan pemain manusia. Namun, setiap langkah harus merupakan program yang berbeda , dihasilkan dari iterasi sebelumnya.
Bagaimana dan dalam bentuk apa Anda mengevaluasi input manusia, terserah Anda, tetapi harus dibaca dari input standar. Demikian pula, Anda bebas untuk memilih metode bagaimana Anda akan menentukan pemain mana yang mulai (misalnya, Anda bertanya terlebih dahulu, atau Anda mengizinkan manusia untuk memasukkan langkah yang tidak valid untuk memberi sinyal bahwa komputer mulai, atau ide lain).
Memvalidasi gerakan tidak perlu, Anda dapat menganggap lawan manusia yang bermain cukup.
Pada dasarnya, Anda memiliki program yang sesuai dengan keadaan dewan. Status dicetak dengan cara apa pun yang dapat dikenali, tetapi setidaknya tingkat rincian berikut diharapkan:
X..
00X
x..
Setelah pemain manusia memasuki gerakannya, program Anda harus membuat iterasi berikutnya sebagai file sumber dalam bahasa yang sama (baik untuk output standar atau ke file) dan berakhir. Anda tidak diperbolehkan menyimpan informasi di tempat lain di luar file sumber itu. (tidak perlu bagi program Anda untuk membangun dan menjalankan program yang dihasilkan, itu bisa dilakukan oleh pengguna - namun, itu tidak dilarang). Ketika program yang dihasilkan dibangun dan dijalankan, ia akan berperilaku sama, menampilkan status, menunggu input pengguna, dll.
Di akhir permainan, Anda harus mencetak hasilnya (apakah Anda menang atau seri) dengan cara apa pun yang dapat diidentifikasikan secara jelas.
Dengan permainan yang sempurna maksud saya program tidak boleh kalah, dan jika ada kemungkinan untuk memaksakan kemenangan, itu harus menang.
Kode terpendek menang , pemenang dipilih setidaknya 10 hari setelah entri pertama yang valid.
Anda mendapatkan pengurangan skor 10% jika program Anda dapat menangani bangunan dan meluncurkan iterasi berikutnya. (Saya tahu, kemungkinan besar itu tidak sepadan) Tentu saja, program itu sendiri harus dihentikan pada saat iterasi berikutnya menerima perpindahan dari pengguna.
Jika Anda menggunakan beberapa trik aneh yang tidak biasa, silakan kirim penjelasan singkat dengan kode Anda.
Jawaban:
Perl, 933 karakter
Harap perhatikan bahwa baris kosong di tengah skrip sebenarnya harus ada di sana. (Garis putus di akhir garis panjang tidak diperlukan, selain untuk keterbacaan, dan tidak termasuk dalam jumlah karakter.)
Penggunaan: Ketika program dijalankan tanpa argumen, ini akan menampilkan kondisi permainan saat ini. Karena pada awalnya papan kosong, output akan menjadi:
Jalankan program dengan argumen antara 1 dan 9 untuk mengklaim kuadrat itu sebagai langkah Anda. Program akan bergerak sendiri dan kemudian mengeluarkan skrip pengganti dengan status baru. Jadi, misalnya:
Pada belokan pertama saja, Anda dapat memberikan gerakan
0
untuk menunjukkan bahwa komputer harus melakukan langkah pertama. Perhatikan bahwa pemain pertama akan selalu seperti ituX
.Saat game berakhir, output display akan menyertakan catatan untuk efek itu:
Program ini bekerja dengan melakukan pencarian minimax standar dari pohon permainan. (Tic-tac-toe adalah permainan yang cukup kecil yang dapat dihasilkan oleh pohon permainan penuh pada setiap proses.) Pengecualian untuk ini adalah ketika komputer bergerak pertama - dalam hal ini gerakan awal ke sudut kiri atas sulit dilakukan. berkode.
Perhatikan bahwa program ini bekerja dengan cara quine yang tepat - tidak ada script mengakses file sumbernya sendiri untuk menghasilkan output.
sumber