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.

captncraig
sumber

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.

Keith Randall
sumber
Sneaky, licik, sihir bitwise +1
Rohan Jhunjhunwala