Kalah di tic-tac-toe


18

Tulis program yang akan dimainkan oleh Misère tic-tac-toe. Artinya, tujuannya adalah untuk memaksa lawan Anda untuk mengambil tiga berturut-turut.

Terima pada input standar baik 'X' atau 'O' (huruf, bukan nol), untuk menentukan sisi mana program akan dimainkan. Kemudian output satu digit untuk gerakan Anda pada giliran Anda, dan baca satu digit pada giliran lawan Anda sampai permainan selesai (X selalu berjalan dulu). Setelah pemenang ditentukan, output X atau O untuk yang menang, atau D untuk seri. Misalnya, jika O mendapat 3 berturut-turut, X menang.

Asumsikan papan diberi nomor seperti:

0|1|2
-----
3|4|5
-----
6|7|8

Idealnya solusi akan optimal dan tidak pernah rugi. Seperti tic-tac-toe, permainan yang sempurna harus selalu menghasilkan hasil seri. Jika protokol di atas dipatuhi, saya dapat menguji pengiriman secara otomatis terhadap berbagai strategi yang mungkin.

Pemenang adalah kode terpendek. poin bonus jika mengambil secara acak dari langkah yang sama baiknya untuk membuatnya sedikit lebih tidak terduga.

Jawaban:


10

Python, 383 karakter

M=[21,1344,86016,4161,16644,66576,65793,4368]
X=lambda B,k:any(m*k==B&m*3for m in M)
def S(B):
 if X(B,2):return 1,
 M=[i for i in range(0,18,2)if B>>i&3<2]
 return max((-S((B|3<<i)^87381)[0],i)for i in M)if M else(0,)
r='D'
c=ord(raw_input())&1
B=0
for i in range(9):
 if i&1==c:m=S(B^c*87381)[1];print m/2;B|=3-c<<m
 else:
  B|=2+c<<input()*2
  if X(B,2+c):r='XO'[c];break
print r

Papan Bdirepresentasikan sebagai bilangan bulat menggunakan dua bit per persegi, dengan 00dan 01mewakili kosong, 10mewakili O dan 11mewakili X. Madalah seperangkat bitmask dengan 01di tempat-tempat dari triple loss ( 21= 0b010101= baris atas dll.) XMenghitung jika ada kehilangan tiga kali lipat untuk khadir di papan tulis. Sapakah minimax mencari langkah optimal untuk X, mengembalikan sepasang skor (1 = menang, -1 = kalah, 0 = imbang) dan indeks kuadrat. ^87381(= ^0b010101010101010101) membalik X dan O sambil membiarkan kotak kosong tidak berubah.

Komputer tidak pernah rugi, jadi saya tidak perlu memasukkan cek itu :).

Mungkin ada algoritma berbasis aturan yang lebih mudah / lebih pendek di luar sana, tetapi ini berfungsi.


Sneaky, licik, sihir bitwise +1
Rohan Jhunjhunwala
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.