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. 少なくとも1つの勝利の動きがある場合、それらの1つをプレイする必要があります。
  3. 相手が次の動きで勝つことを防ぐことができるなら、そうしなければなりません。

最適なプレイは必要ないことに注意してください。ただちに勝利するか、対戦相手の即時勝利を妨げます。対戦相手に複数の勝ち方がある場合、それらをブロックする必要はありません。

標準入力でボードが提供され、標準出力で再生する列番号を印刷する必要があります。ボードは正しい形式(ホールなし、少なくとも1つの可能な動き)であることが保証されており、どちらのプレイヤーもまだ勝てないことが保証されています。

最短のコードが優先されます。

例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文字+改行を含める必要があります。
ボードは、7x6ではなく8x8マトリックスとして扱われます。8番目の列には改行が含まれ、2つの余分な行にはゼロが含まれているため、ソリューションに干渉しません。彼らは実際に役立ちます-右端の列から右に移動するとき、境界チェックとして機能する改行列にヒットします。

w勝つまたはブロックする機会のために1つのポジションをチェックします。q周りをチェックするセルでなければなりません。再帰を使用して、4つの方向をループします(9、8、7で始まり、その後数回1)。方向から前後
Cに同じ文字のシーケンスをチェックします。両方のシーケンスの合計を返します(開始位置はカウントしません)。したがって、3が返された場合、4行になります。qd

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 591576557523523459458433バイト

これはこれまで達成した中で最高です。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-line(行7)には1つのタブのインデントがあります。SEはタブが好きではありません。


2
私はこれらを精製するのに時間をかけすぎています。また、例4では、458バイトバージョンは正しく動作しませんでした。25バイトを取り除いてください。魔法。
seequ 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.