Mainkan Connect 4!

20

Tulis program untuk memainkan game Connect 4 . Anda diberi status papan sebagai input dan Anda harus memutuskan kolom mana yang akan menempatkan bagian Anda untuk mendapatkan 4 berturut-turut (horizontal, vertikal, atau diagonal) atau memblokir lawan Anda dari melakukan hal yang sama.

Papan adalah larik 6x7, di mana setiap sel mungkin kosong (''), berisi bagian Anda ('X') atau bagian lawan Anda ('O'). Papan contoh:

O      
XX    X
XOX  OO
XOO OXO
OXXOXXO
XOXOXOX

Anda ingin bermain di kolom 3 (kolom 0-6, diberi nomor dari kiri) untuk kemenangan diagonal. Jadi, Anda menghasilkan:

3

Kode Anda harus menampilkan nomor kolom, dan harus memenuhi kriteria berikut:

  1. Anda tidak bisa bermain di kolom yang sudah memiliki 6 buah di dalamnya.
  2. Jika setidaknya ada satu gerakan yang menang, Anda harus memainkan salah satunya.
  3. Jika Anda dapat mencegah lawan untuk menang pada langkah berikutnya, Anda harus melakukannya.

Perhatikan bahwa permainan optimal tidak diperlukan, hanya saja Anda mengambil kemenangan langsung atau mencegah kemenangan langsung lawan Anda. Jika lawan Anda memiliki lebih dari satu cara untuk menang, Anda tidak perlu memblokirnya.

Anda diberikan papan pada input standar dan harus mencetak nomor kolom di mana Anda ingin bermain pada output standar. Papan dijamin akan terbentuk dengan baik (tidak ada lubang, setidaknya satu langkah yang mungkin) dan belum memiliki kemenangan untuk salah satu pemain.

Kode terpendek menang.

Contoh 1

      X
      O
      X
      O
 OOO  X
 XXX  O

Anda harus memainkan kolom 0 atau 4 untuk menang.

Contoh 2

      X
X     X
O     O
XOX  XO
XXO XOX
XXO XXO

Anda harus bermain kolom 3 untuk memblokir kemenangan langsung lawan Anda.

Contoh 3

X      
XO     
OX    O
XO   XX
XXO OOO
OOO XXO

Anda tidak dapat memenangkan atau menghentikan lawan dari kemenangan, jadi Anda dapat memainkan kolom 1-6 (0 penuh).

Contoh 4

X      
O      
X      
OOO    
XOX    
OXOX   

Anda tidak dapat bermain di kolom 3, karena memungkinkan lawan Anda menang dengan segera. Anda dapat bermain di kolom 1-2 atau 4-6.

Keith Randall
sumber

Jawaban:

9

C, 234 286 256 karakter

Diperbaiki untuk menyelesaikan masalah dengan benar, dengan memeriksa gerakan kemenangan lawan setelah setiap gerakan dilakukan.

Kode ini sangat sensitif terhadap format file input - setiap baris harus berisi 7 karakter + baris baru.
Papan diperlakukan sebagai matriks 8x8, bukan 7x6. Kolom ke-8 berisi baris baru, dan 2 baris tambahan berisi nol, sehingga tidak mengganggu solusi. Mereka benar-benar membantu - Ketika bergerak langsung dari kolom paling kanan, Anda menekan ke kolom baris baru, yang berfungsi sebagai pemeriksaan batas.

wmemeriksa satu posisi untuk peluang menang atau memblokir. qharusnya sel untuk memeriksa. Ia menggunakan reursion untuk mengulang melalui 4 arah (dimulai dengan 9,8,7, kemudian beberapa kali 1).
Cmemeriksa urutan karakter yang identik mulai dari qarah d, baik bolak-balik. Ini mengembalikan jumlah kedua urutan (tidak termasuk posisi awal), jadi jika mengembalikan 3, ada deretan 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
sumber
5

Python 2.x - 594 591 576 557 523 459 458 433 byte

Ini adalah yang terbaik yang saya raih sejauh ini. Saya kira sulit untuk mengalahkan C. Tantangan yang luar biasa, harus saya katakan.

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 (baris 7) memiliki lekukan satu tab. SE tidak suka tab.

seequ
sumber
2
Saya menghabiskan terlalu banyak waktu untuk memperbaiki ini. Juga, versi 458 byte tidak berfungsi dengan benar misalnya # 4. Ambil 25 byte dan itu terjadi. Sihir.
seequ