Codegolf - Играй В Connect 4!

  • Автор темы Andrew93
  • Обновлено
  • 20, Oct 2024
  • #1

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

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

 
 
 
 
 
 X      
O      
X      
OOO    
XOX    
OXOX   
 

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

X XO OX O XO XX XXO OOO OOO XXO

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

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

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

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

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

Пример 1

X X X O O XOX XO XXO XOX XXO XXO

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

Пример 2

X O X O OOO X XXX O

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

Пример 3

3

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

Пример 4

O XX X XOX OO XOO OXO OXXOXXO XOXOXOX

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

#код-гольф #настольная игра

Andrew93


Рег
13 Apr, 2020

Тем
74

Постов
170

Баллов
580
  • 26, Oct 2024
  • #2

С, 234 286 256 символов

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

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

 
 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]
 
checks one position for an opportunity to win or block. 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); } должна быть камера, чтобы осмотреться. Он использует рекурсию для прохода по 4 направлениям (начинается с 9,8,7, затем несколько раз 1).
d checks for a sequence of identical characters starting at q в направлении C , both back and forth. It returns the sum of both sequences (not counting the starting position), so if it returns 3, there's a row of 4.

q ||answer||

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

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

w

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

 

Migaly


Рег
04 Mar, 2007

Тем
53

Постов
185

Баллов
510
Тем
403,760
Комментарии
400,028
Опыт
2,418,908