틱택 토에서 길을 잃다


18

a가 Misère tic-tac-toe 게임을하는 프로그램을 작성하십시오. 즉, 목표는 상대방이 3 연승을하게하는 것입니다.

표준 입력에서 'X'또는 'O'(0이 아닌 문자)를 수락하여 프로그램을 재생할 쪽을 결정하십시오. 그런 다음 차례에 당신의 움직임에 대한 한 자리를 출력하고 게임이 끝날 때까지 상대 차례에서 한 자리를 읽습니다 (X는 항상 먼저갑니다). 승자가 결정되면, 승자는 X 또는 O를, 무승부는 D를 출력합니다. 예를 들어, O가 연속으로 3을 얻으면 X가 이깁니다.

보드에 다음과 같이 번호가 매겨 졌다고 가정하십시오.

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

이상적인 솔루션은 최적이며 결코 잃지 않습니다. 틱택 토와 마찬가지로 완벽한 플레이는 항상 무승부입니다. 위의 프로토콜을 준수하면 다양한 전략에 따라 자동으로 제출을 테스트 할 수 있습니다.

우승자는 가장 짧은 코드입니다. 똑같이 좋은 움직임에서 무작위로 선택하면 보너스 포인트를 예측할 수 없습니다.

답변:


10

파이썬, 383 자

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

보드가 B평방 당 두 개의 비트를 이용하여 인 정수로 표현 00하고 01, 빈 나타내는 10O를 표현하고 11X. 나타내는가 M에 비트 마스크의 집합이다 01잃는 트리플 (의 점에서 21= 0b010101등 = 상단 행) X임의지는 경우 계산해 트리플 k은 보드에 있습니다. Sminimax는 X에 대한 최적의 이동을 검색하여 점수 쌍 (1 = win, -1 = lose, 0 = draw)과 제곱 지수를 반환합니다. ^87381(= ^0b010101010101010101)는 빈 사각형을 변경하지 않고 X와 O를 뒤집습니다.

컴퓨터는 절대로 잃어 버리지 않으므로 확인을 포함하지 않아도됩니다. :).

더 쉽고 짧은 규칙 기반 알고리즘이있을 수 있지만이 방법이 효과적입니다.


음흉한 음흉한 비트 마법 +1
Rohan Jhunjhunwala
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.