Xác định người chiến thắng của Kết nối 4


19

Bạn được cung cấp một lưới Connect 4 được điền một phần (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

(Đầu vào có thể được cung cấp dưới dạng mảng 1D hoặc 2D và dưới dạng chữ cái hoặc số, v.v.)

Giả định rằng

  • X bắt đầu trò chơi.
  • Chưa có ai chiến thắng.
  • Người chơi có thể đã không chơi tốt cho đến bây giờ, nhưng bây giờ trở đi cả hai sẽ sử dụng các chiến lược tối ưu.
  • Lưới đầu vào không bị lỗi.

Bạn phải xuất một giá trị duy nhất cho biết người chơi nào thắng (hoặc hòa)

Mã thách thức golf; mã ngắn nhất sẽ thắng. Chương trình của bạn không phải tính toán thực tế đầu ra trong khoảng thời gian hợp lý, nhưng bạn sẽ có thể chứng minh rằng đầu ra sẽ được lấy chính xác trong một khoảng thời gian hữu hạn.



@ MartinBüttner Điều đó có nghĩa là tôi sẽ bị từ chối, hoặc để lại câu hỏi của tôi ở đây có ổn không?
ghosts_in_the_code

4
Nó chỉ có nghĩa là các câu hỏi có liên quan, không hơn, không kém. Mục đích của việc đăng liên kết là để các thách thức xuất hiện trong thanh bên "Được liên kết" của nhau, vì vậy mọi người có thể tìm thấy các thử thách liên quan dễ dàng hơn. Nếu tôi coi câu hỏi của bạn là trùng lặp, tôi sẽ nói như vậy (hoặc chỉ đóng nó), vì vậy đừng lo lắng. :)
Martin Ender

2
"Chơi tối ưu" có được xác định rõ không? Nếu vậy, bạn có thể cung cấp một liên kết mô tả thuật toán để chơi tối ưu không?
Rainbolt

2
@Rainbolt Nó đã được giải quyết và cũng tồn tại các thuật toán hoàn hảo . Đọc Wikipedia để biết thêm.
ghosts_in_the_code

Câu trả lời:


16

Perl, 119 118 117 byte

Bao gồm +4 cho -0p

Cho bảng xoay được đệm với khoảng trống trên STDIN (trọng lực kéo đá sang phải)

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

In 3nếu người chơi di chuyển thắng, 1nếu người chơi di chuyển thua và 2rút thăm.

Trên các perls cũ hơn, bạn có thể sử dụng một chữ ^Sđể đạt được một byte. Nếu bạn không nhớ cực đoan không hiệu quả, bạn có thể bỏ qua $$_||=(bảng chuyển vị) và đạt được hơn 6 byte. Nếu bạn rời khỏi $_=nó, nó sẽ chỉ cho bạn nơi chơi thay vì kết quả (chơi 1và thắng nếu có, chơi 2và rút nếu có hoặc chơi bất kỳ 3và thua)

Xây dựng và đánh giá một cây minimax hoàn chỉnh. Bạn sẽ hết bộ nhớ và thời gian trừ khi bảng đã được lấp đầy một cách hợp lý.


2
Tại sao trên trái đất có ai đó downvote? Việc chơi golf thực sự tuyệt vời (tôi chơi golf với perl và có được giải pháp như vậy cực kỳ khó khăn - tôi không chắc bất kỳ tay golf perl nào khác mà tôi biết có thể đã đưa ra mã đó). Và mã có hành vi cần thiết.
Dada

Điều này làm cho não của tôi bị tổn thương. +1!
levelonehuman

@Dada làm thế nào để bạn biết câu trả lời này được bình chọn? Tôi thấy 3 là bình chọn ...
RosLuP

@RosLuP khi tôi lần đầu tiên nhìn thấy bài đăng này, nó đã có 1 downvote. Ngoài ra, khi bạn có đủ đại diện, bạn có thể thấy có bao nhiêu lượt bình chọn lên xuống của một bài đăng: trong trường hợp đó, bây giờ nó có 4 lên và 1 xuống.
Dada
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.