Грати Connect 4!


20

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

Дошка - це масив розміром 6x7, де кожна комірка може бути порожньою (''), містити свій шматок ('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. 8-й стовпець містить нові рядки, а два додаткові рядки містять нулі, тому вони не заважають вирішенню. Вони насправді допомагають. Під час переміщення праворуч від крайнього правого стовпця ви переходите до стовпця нового рядка, який слугує граничною перевіркою.

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);
}

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 не любить вкладки.


2
Я витрачаю занадто багато часу на їх вдосконалення. Крім того, версія 458 байт працювала неправильно, наприклад, №4. Візьміть 25 байтів і це зробити. Магія.
seequ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.