Python 2: 399 401 349 333 317 370 bayt
2x Hata Düzeltmesi: l4m2'ye kredi
-52 karakter: yeraltı monorayına kredi
-16 karakter: Jonathan Frech'e kredi
-26 karakter: kullanıcıya kredi202729
def f(b):
t=4,9,2,3,5,7,8,1,6;n=lambda k:[t[i]for i,j in enumerate(b)if j==k];p,o,a,I=n(2),n(1),n(0),t.index
for i in p:
for j in p:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in o:
for j in o:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in 9,3,7,1:
if i in a and 5 in p:return I(i)
for i in 5,4,2,8,6:
if i in a:return I(i)
return I(a[0])
Çevrimiçi deneyin!
Geçen yarıyıl aldığım doğrusal cebir kursunun ilk gününde, zeki yüksek lisans öğrencisi eğitmenim, tic-tac-toe board'u matris olarak temsil ederseniz:
4 | 9 | 2
--+---+--
3 | 5 | 7
--+---+--
8 | 1 | 6
daha sonra arka arkaya üç elde etmek, aralıkta [1,9] 15'e kadar olan üç sayı seçmeye eşdeğerdir. Bu yanıt bu fikirden yararlanır. Fonksiyon, tahtayı temsil eden dokuz sayı içeren bir liste alır. 0 boş bir alanı gösterir, 1 rakip tarafından işgal edilir ve 2 program tarafından yapılan önceki bir oyunu temsil eder. İlk 3 satır, programın hangi sayıları seçtiğini (p), muhalefet (o) 'yı seçtiğini ve hala kullanılabilir durumda olduğunu (a) gösterir. Daha sonra mevcut sayıları inceler ve daha önce seçmiş olduğu iki sayı ile birleştiğinde on beşe ekler. Eğer yaparsa, o kareyi seçecek ve kazanacaktır. Eğer hemen kazanma hamlesi yoksa, rakibin aynı yöntemi kullanarak kazanıp kazanamayacağını kontrol eder. Eğer yapabilirlerse, kazanan karelerini alacaktır. Ne kazanan ne de engelleme hareketi mevcutsa, bir köşede hareket edecek. Bu bir aptal arkadaşı önler:
- - -
- X -
- - -
- O - # Bad Move
- X -
- - -
- O X
- X -
- - -
- O X
- X -
O - -
- O X
- X -
O - X
Bu durumlardan hiçbiri meydana gelmezse, keyfi olarak bir kare seçecektir. Fonksiyon, algoritma tarafından seçilen 0 indekslenmiş kareyi temsil eden bir sayı [0,8] çıkarır.
Düzenleme: Algoritma şimdi merkeze diyagonal üzerinde öncelik verir, bu da l4m2 ve ilgili stratejilerle gösterilen başka bir aptal eş olasılığını önler.
Düzenleme: Açıklığa kavuşturmak için, işlev bir dizi şeklinde bir tahtayı alır ve [0,8] üzerinde tamsayı olarak bir hareket çıkarır. Bu G / Ç stratejisi çok karmaşık olduğu için, onu daha etkileşimli hale getiren bir sarıcı komut dosyası. Tek bir komut satırı argümanı alır; bu, oyuncu önce giderse 1, program önce giderse 0 olmalıdır.
import sys
def f(b):
t=4,9,2,3,5,7,8,1,6;n=lambda k:[t[i]for i,j in enumerate(b)if j==k];p,o,a,I=n(2),n(1),n(0),t.index
for i in p:
for j in p:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in o:
for j in o:
for k in a:
if i+j+k==15and-j+i:return I(k)
for i in 9,3,7,1:
if i in a and 5 in p:return I(i)
for i in 5,4,2,8,6:
if i in a:return I(i)
return I(a[0])
board = [0,0,0,0,0,0,0,0,0]
rep = {0:"-",1:"X",2:"O"}
turn = int(sys.argv[1])
while True:
for i in range(3):
print rep[board[i*3]]+" "+rep[board[i*3+1]]+" "+rep[board[i*3+2]]
print
if turn:
move = int(raw_input("Enter Move [0-8]: "))
else:
move = f(board)
board[move] = turn+1
turn = (turn+1)%2
we can assume that all previous moves of the 2nd player were also played by our engine