파이썬 2 : 399 401 349 333 317 370 바이트
2x 버그 수정 : l4m2의 크레딧
-52 자 : 지하 모노레일 크레딧
-16 자 : Jonathan Frech의 신용
-26 자 : 사용자의 신용
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])
온라인으로 사용해보십시오!
선형 대수 과정의 첫 날에 지난 학기를 치렀습니다. 저의 훌륭한 대학원생 강사는 틱택 토 보드를 행렬로 표현하면 다음과 같이 제안했습니다.
4 | 9 | 2
--+---+--
3 | 5 | 7
--+---+--
8 | 1 | 6
그런 다음 연속으로 3을 얻는 것은 [1,9] 범위에서 15를 더하는 3 개의 숫자를 선택하는 것과 같습니다.이 답변은이 아이디어를 이용합니다. 이 함수는 보드를 나타내는 9 개의 숫자가 포함 된 목록을 가져옵니다. 0은 빈 공간을 나타내고 1은 상대방이 차지하고 2는 프로그램이 수행 한 이전 플레이를 나타냅니다. 처음 3 줄은 프로그램이 어떤 숫자를 고른 지 (p), 반대가 고른 지 (o), 여전히 유효한지 (a)를 알아냅니다. 그런 다음 사용 가능한 숫자를 살펴보고 이미 선택한 두 개의 숫자와 함께 15 개가 추가되는지 확인합니다. 만약 그렇다면, 그 광장을 골라서 이길 것입니다. 즉시이기는 움직임이 없으면 상대방이 같은 방법으로 이길 수 있는지 확인합니다. 그들이 할 수 있다면, 승리하는 광장을 차지할 것입니다. 승리 또는 블로킹 이동이없는 경우 코너에서 움직입니다. 이것은 바보 친구를 방지합니다 :
- - -
- X -
- - -
- O - # Bad Move
- X -
- - -
- O X
- X -
- - -
- O X
- X -
O - -
- O X
- X -
O - X
이러한 상황이 발생하지 않으면 임의로 사각형을 선택합니다. 이 함수는 알고리즘에 의해 선택된 0 인덱스 사각형을 나타내는 숫자 [0,8]을 출력합니다.
편집 : 알고리즘은 이제 대각선보다 중심을 우선시하여 다른 바보가 l4m2 및 관련 전략으로 지적 될 가능성을 방지합니다.
편집 : 명확히하기 위해, 함수는 보드 형태로 보드를 가져 와서 [0,8]에서 정수로 이동을 출력합니다. 이 I / O 전략이 너무 복잡하기 때문에보다 대화식으로 만드는 래퍼 스크립트가 있습니다. 단일 명령 행 인수가 필요합니다. 플레이어가 먼저 가면 1이되고 프로그램이 먼저 가면 0이됩니다.
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