Играть в Connect 4!

20

Напишите программу для игры в Connect 4 . Вам дается состояние доски в качестве входных данных, и вы должны решить, в какой столбец поместить свою фигуру, чтобы получить 4 в ряд (по горизонтали, вертикали или по диагонали) или заблокировать противника от того же.

Доска представляет собой массив 6х7, где каждая клетка может быть пустой (''), содержать вашу фигуру ('X') или фигуру вашего оппонента ('O'). Пример платы:

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

Вы хотели бы играть в столбце 3 (столбцы 0-6, пронумерованы слева) для диагонального выигрыша. Итак, вы выводите:

3

Ваш код должен выводить номер столбца, и он должен удовлетворять следующим критериям:

  1. Вы не можете играть в колонке, в которой уже есть 6 фигур.
  2. Если есть хотя бы один выигрышный ход, вы должны сыграть один из них.
  3. Если вы можете помешать вашему оппоненту выиграть в следующий ход, вы должны это сделать.

Обратите внимание, что оптимальная игра не обязательна, только то, что вы немедленно выиграли или предотвратили немедленную победу оппонента. Если у вашего оппонента есть несколько способов выиграть, вам не нужно блокировать ни один из них.

Вам дают доску на стандартном вводе и вы должны напечатать номер столбца, в котором вы хотите играть на стандартном выводе. Доска гарантированно будет хорошо сформирована (нет лунок, по крайней мере, один возможный ход) и не получит выигрыша ни у одного из игроков.

Самый короткий код выигрывает.

Пример 1

      X
      O
      X
      O
 OOO  X
 XXX  O

Вы должны сыграть в колонке 0 или 4 для победы.

Пример 2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

Вы должны сыграть в колонку 3, чтобы заблокировать немедленный выигрыш противника.

Пример 3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

Вы не можете выиграть или остановить своего противника, поэтому вы можете сыграть в любой столбец 1-6 (0 заполнен).

Пример 4

X      
O      
X      
OOO    
XOX    
OXOX   

Вы не можете играть в колонке 3, так как это позволяет вашему противнику немедленно выиграть. Вы можете играть в колонках 1-2 или 4-6.

Кит Рэндалл
источник

Ответы:

9

C 234 286 256 символов

Исправлено, чтобы правильно решить проблему, проверяя выигрышные ходы противника после каждого предпринятого хода.

Этот код очень чувствителен к формату входного файла - каждая строка должна содержать 7 символов + перевод строки.
Плата рассматривается как матрица 8х8, а не 7х6. Восьмой столбец содержит символы новой строки, а 2 дополнительные строки содержат нули, поэтому они не влияют на решение. Они действительно помогают - при движении вправо от крайнего правого столбца вы попадаете в столбец новой строки, который служит для проверки границы.

wпроверяет одну позицию на возможность выиграть или заблокировать. qдолжна быть клетка, чтобы проверить вокруг. Он использует рекурсию, чтобы пройти через 4 направления (начинается с 9,8,7, затем несколько раз 1).
Cпроверяет последовательность идентичных символов, начиная qс направления d, в обоих направлениях . Он возвращает сумму обеих последовательностей (не считая начальную позицию), поэтому, если он возвращает 3, есть строка 4.

char B[99],q;
C(i,d){
    return B[d*i+++q]-B[q]?d>0?C(1,-d):0:1+C(i,d);
}
w(x){
    return x&&C(1,x>6?x:1)>2|w(x-1);
}
t(l,c,r,v){
    for(;c--;)B[q=c]&32&B[c+8]-32?r=w(9,B[c]=l)?v=c:v||r*t(79,l,0,1)?r:c,B[c]=32:0;
    return r;
}
main(){
    putchar(48+t(88,16+read(0,B+16,48),0,0)%8);
}
ugoren
источник
5

Python 2.x - 594 591 576 557 523 459 458 433 байта

Это лучшее, чего я достиг на данный момент. Я предполагаю, что трудно победить C. Удивительный вызов, я должен сказать.

r=range
f=[]
exec'f+=list(raw_input());'*6
def n(p):
 o,b,a,k=[],1,'O',lambda q:any([o[i:i+4]==list(q)*4for o in(f[x-x%7:],f[x%7::7])for i in r(3)]+[all(q==f[7*(y+u*i)+z+i]for i in r(4))for u,z,v,c in((1,0,3,4),(-1,3,6,3))for y in r(z,v)for z in r(c)])
 for x in r(42):
    if x>34<a>f[x]or x<35and f[x+7]>'0'>f[x]:f[x]=p;z=k(p)*b;o=z*[x]+o+[x]*(a==p or n(a)[1]);b-=z;f[x]=' '
 return o[0]%7,b
a,b,c,d=n('X')+n('O')
print(a,(c,a)[d])[b]

Строка if (строка 7) имеет отступ одной вкладки. SE не любит вкладки.

seequ
источник
2
Я трачу слишком много времени на их доработку. Кроме того, 458-байтовая версия не работала правильно, например, # 4. Уберите 25 байтов, и это так. Магия.
Seequ