Tentukan pemenang Connect 4

19

Anda diberi kotak Hubungkan 4 yang terisi sebagian (7x6).

O X             
O X          
X O X O     O
X O X O   X X
O X X X O O X
O O O X X O X

(Input dapat diberikan sebagai array 1D atau 2D dan sebagai huruf atau angka, dll.)

Asumsikan bahwa

  • X memulai permainan.
  • Belum ada yang menang.
  • Pemain mungkin belum bermain dengan baik sampai sekarang, tetapi sekarang dan seterusnya mereka berdua akan menggunakan strategi yang optimal.
  • Grid input tidak salah.

Anda harus menampilkan nilai tunggal yang menunjukkan pemain mana yang menang (atau seri)

Tantangan golf kode; jadi kode terpendek menang. Program Anda tidak harus benar-benar menghitung output dalam jumlah waktu yang wajar, tetapi Anda harus dapat membuktikan bahwa output akan diperoleh dengan benar dalam jumlah waktu yang terbatas.

ghosts_in_the_code
sumber
Terkait
Martin Ender
@ MartinBüttner Apakah itu berarti saya akan downvoted, atau tidak apa-apa meninggalkan pertanyaan saya di sini?
ghosts_in_the_code
4
Ini hanya berarti pertanyaan terkait, tidak lebih, tidak kurang. Tujuan memposting tautan adalah agar tantangan muncul di sidebar "Tertaut" satu sama lain, sehingga orang dapat menemukan tantangan terkait dengan lebih mudah. Jika saya menganggap pertanyaan Anda sebagai duplikat, saya akan mengatakannya (atau hanya menutupnya), jadi jangan khawatir. :)
Martin Ender
2
Apakah "permainan optimal" didefinisikan dengan baik? Jika demikian, dapatkah Anda memberikan tautan yang menggambarkan algoritme untuk permainan optimal?
Rainbolt
2
@Rainbolt Telah dipecahkan dan ada juga algoritma yang sempurna . Baca Wikipedia untuk lebih lanjut.
ghosts_in_the_code

Jawaban:

16

Perl, 119 118 117 byte

Termasuk +4 untuk -0p

Berikan papan yang dirotasi dengan spasi pada STDIN (gravitasi menarik batu ke kanan)

connect4.pl
  OXXX
   XOO
    OX
  OOXX
  XXXO
XXOOXO
OOXXOO
^D

connect4.pl:

#!/usr/bin/perl -p0
y/XO/OX/if$^S|y/X//>y/O//;$_=$$_||=/Z@{[map"|O".".{$_}O"x3,0,5..7]}/sx||s% (?! )%$_="$`X$'";do$0%eg?/1/?3:1+/2/:2

Mencetak 3jika pemain bergerak menang, 1jika pemain bergerak kalah dan 2seri.

Pada perl yang lebih lama Anda dapat menggunakan literal ^Suntuk mendapatkan satu byte. Jika Anda tidak keberatan dengan inefisiensi ekstrim, Anda dapat $$_||=mengabaikan (tabel transposisi) dan mendapatkan 6 byte lebih banyak. Jika Anda membiarkannya keluar, $_=itu akan menunjukkan tempat untuk bermain alih-alih hasilnya (bermain 1dan menang jika ada, bermain 2dan menggambar jika ada satu atau bermain di mana saja 3dan kalah)

Membangun dan mengevaluasi pohon minimax lengkap. Anda akan kehabisan memori dan waktu kecuali papan sudah diisi dengan cukup baik.

Ton Hospel
sumber
2
Mengapa seseorang meremehkan seseorang? Golf benar-benar menakjubkan (saya golf dengan perl dan mendapatkan solusi tersebut adalah extremly keras - Saya tidak yakin apa perl lainnya pegolf saya tahu bisa datang dengan kode itu). Dan kode tersebut memiliki perilaku yang diperlukan.
Dada
Ini membuat otak saya sakit. +1!
levelonehuman
@Dada bagaimana Anda tahu jawaban ini tidak dipilih? Saya melihat 3 sebagai suara ...
RosLuP
@RosLuP ketika saya pertama kali melihat posting ini, ada 1 downvote. Juga, ketika Anda memiliki cukup perwakilan, Anda dapat melihat berapa banyak suara naik dan turun yang dimiliki sebuah pos: dalam hal ini, sekarang ada 4 ke atas dan 1 ke bawah.
Dada