Berikut ini adalah masalah menarik yang saya pikirkan di hari lain, yang melibatkan potongan kode yang bersaing dengan potongan kode lainnya tidak hanya di properti yang dimiliki kode tersebut, tetapi dengan memainkan permainan melawan potongan kode lainnya.
Tugas Anda adalah membangun program yang mengambil status Go board saat ini, dan menentukan langkah apa yang harus dilakukan atau untuk dilalui.
Program Anda akan menerima yang berikut sebagai masukan:
19 baris, masing-masing dengan 19 karakter, mewakili bagian yang saat ini ada di papan Go. Karakter
0
mewakili kotak kosong,1
hitam, dan2
putih.Dua angka yang mewakili jumlah potongan tahanan yang dimiliki masing-masing pemain (hitam, kemudian putih).
Satu angka yang mewakili giliran siapa yang akan bergerak (hitam atau putih). Seperti di atas,
1
berwarna hitam, dan2
putih.
dan output salah satu dari berikut ini:
Sepasang koordinat yang
a b
mewakili koordinat untuk bergerak.1 1
adalah kotak kiri atas, dan angka pertama dan kedua mewakili masing-masing bergerak ke bawah dan ke kanan.String
pass
, yang mewakili gerakan untuk lulus.
Misalnya, program dapat menerima input berikut:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000000000000000000
0001210000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
0 0 1
yang mewakili permainan di mana hanya beberapa gerakan telah dimainkan.
Kemudian program akan menampilkan 6 5
, yang berarti "letakkan batu hitam di titik 6 dari atas dan 5 dari kiri". Ini akan menangkap batu putih di 7 5
. Keadaan dewan akan berubah menjadi:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000100000000000000
0001010000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
1 0 2
(Perhatikan bahwa meskipun batu putih ditangkap, itu dianggap sebagai tahanan hitam.)
Kode Anda juga harus memenuhi properti berikut:
Jika program Anda diberi status input yang sama, itu harus selalu menghasilkan output yang sama. Ini adalah determinisme dari AI AI. Itu tidak boleh memiliki komponen acak.
Program Anda tidak boleh lebih dari sekitar 60 detik untuk menentukan langkah apa yang harus dilakukan. Aturan ini tidak akan diterapkan secara ketat karena variasi dalam daya komputasi, tetapi harus bergerak dalam jumlah waktu yang wajar.
Kode sumber program Anda harus tidak melebihi total 1 megabyte (1.048.576 byte).
Program Anda harus selalu membuat langkah hukum. Program Anda tidak dapat bergerak di mana batu sudah ada, dan tidak dapat menempatkan sepotong yang akan menghasilkan sekelompok batu yang ditangkap. (Satu pengecualian untuk aturan untuk keperluan tantangan ini adalah bahwa suatu program diizinkan untuk membuat posisi yang semula ada - karena hanya diberi posisi papan saat ini, tidak dapat diharapkan untuk menyimpan gerakan yang telah dibuat. sebelum.)
Kiriman Anda kemudian akan bermain di turnamen semua-main-semua melawan semua kiriman lainnya, dalam permainan Go di mana kondisi dewan dimulai sebagai kosong, dan setiap program bergiliran diberi makan posisi papan dan bergerak .
Setiap pasangan kiriman akan bermain dua putaran - satu putaran dengan masing-masing pemain berwarna hitam. Karena AI dalam masalah ini sepenuhnya deterministik, dua AI yang sama yang bermain bersama akan selalu menghasilkan game yang persis sama dimainkan.
Ketentuan untuk menang adalah sebagai berikut:
Jika program Anda dimainkan hingga akhir pertandingan, aturan pemberian skor Tiongkok akan digunakan untuk menentukan pemenang. Tidak ada komi akan diterapkan.
Jika program Anda bermain ke titik bahwa keadaan sebelumnya tercapai, sehingga menyebabkan loop tak terbatas, kedua program akan dinyatakan telah diikat.
Kiriman Anda akan dinilai berdasarkan berapa banyak skor yang diperoleh dibandingkan kiriman lainnya. Kemenangan bernilai 1 poin, dan seri bernilai setengah poin. Pengajuan dengan poin terbanyak adalah pemenang keseluruhan.
Ini adalah tantangan besar, di mana siapa pun dapat memposting entri baru kapan saja, dan kedudukan akan dievaluasi kembali secara berkala ketika ini terjadi.
sumber
Jawaban:
Inilah entri saya untuk mengatasi tantangan ini. Kode python:
Menurut aturan Anda, selalu bermain "lulus" adalah strategi yang valid (meskipun buruk).
sumber
Java: Pilih satu tempat, tempat apa saja
Cukup pilih tempat di papan tulis untuk menguji validitas. Ia menggunakan PRNG, tetapi dengan set seed sehingga itu deterministik. Ia menggunakan potongan yang berbeda dari siklus PRNG tergantung pada berapa banyak putaran telah berlalu.
Untuk setiap posisi kandidat, ini memeriksa untuk melihat bahwa itu adalah langkah yang valid (tetapi bukan bahwa itu langkah yang cerdas ). Jika tidak, ia pindah ke kandidat berikutnya. Jika tidak dapat menemukan langkah yang valid setelah 1000 kali mencoba, itu akan berlalu.
sumber
Beberapa Scala:
Dari membaca Wikipedia, saya pikir ini akan mengalahkan solusi saat ini.
sumber
1 1
danpass
).1 1
, sebenarnya, karena program selalu dijalankan lagi setiap kali papan berubah.Jawa
Memilih ruang kosong pertama. Menang melawan salah satu AI pada saat posting.
sumber
1 1
akan ditangkap oleh putih (sekarang kosong) dan tidak dapat dimainkan oleh hitam pada belokan berikutnya.