Пройграйте на тик-носі


18

Напишіть програму, в якій буде грати в гру Misère tic-tac-toe. Тобто мета - змусити опонента взяти трійку поспіль.

Прийміть на стандартному вході або "X" або "O" (літера, не нуль), щоб визначити, на якій стороні програма буде грати. Потім на черзі виведіть одну цифру для свого руху та прочитайте одну цифру на ваших опонентах, доки гра не закінчиться (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представляє порожніми, 10які представляють O і 11представляє X. Mявляє собою набір бітмаскі з 01в точках програшною трійки ( 21= 0b010101= верхня рядки і т.д.) , Xщо обчислюються Якщо який - або програш потрійний для kприсутній на дошці. Sчи шукає minimax оптимальний хід для X, повертаючи пару балів (1 = виграш, -1 = програш, 0 = нічия) та квадратний індекс. ^87381(= ^0b010101010101010101) перевертає X і O, залишаючи порожні квадрати незмінними.

Комп'ютер ніколи не програє, тому мені не потрібно було включати цю перевірку :).

Напевно, існує простіший / коротший алгоритм, заснований на правилах, але це працює.


Підлий підлий чародійство чаклунства +1
Rohan Jhunjhunwala
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.