กำหนดผู้ชนะการแข่งขัน Connect 4


19

คุณได้รับตาราง Connect 4 ที่ได้รับการเติมเต็มบางส่วน (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

(อินพุตสามารถกำหนดเป็นอาร์เรย์ 1D หรือ 2D และเป็นตัวอักษรหรือตัวเลขเป็นต้น)

สมมติว่า

  • X เริ่มเกม
  • ยังไม่มีใครได้รับรางวัล
  • ผู้เล่นอาจเล่นได้ไม่ดีจนถึงตอนนี้ แต่ตอนนี้พวกเขาทั้งสองจะใช้กลยุทธ์ที่ดีที่สุด
  • กริดอินพุตไม่ผิดพลาด

คุณต้องส่งออกค่าเดียวที่ระบุว่าผู้เล่นคนใดชนะ (หรือเสมอ)

ความท้าทายของรหัสกอล์ฟ รหัสที่สั้นที่สุดจึงชนะ โปรแกรมของคุณไม่จำเป็นต้องคำนวณผลลัพธ์จริงในระยะเวลาที่เหมาะสม แต่คุณควรจะสามารถพิสูจน์ได้ว่าผลลัพธ์จะได้รับอย่างถูกต้องภายในระยะเวลาที่ จำกัด



@ MartinBüttnerนั่นหมายความว่าฉันจะถูกลดระดับลงหรือไม่ดีที่จะทิ้งคำถามไว้ที่นี่?
ghosts_in_the_code

4
มันหมายถึงคำถามที่เกี่ยวข้องไม่มีอะไรมากไม่มีอะไรน้อย จุดประสงค์ของการโพสต์ลิงค์คือความท้าทายที่จะปรากฏในแถบด้านข้าง "เชื่อมโยง" ของกันและกันเพื่อให้ผู้คนสามารถค้นหาความท้าทายที่เกี่ยวข้องได้ง่ายขึ้น หากฉันคิดว่าคำถามของคุณซ้ำกันฉันจะพูดอย่างนั้น (หรือปิดคำถาม) ดังนั้นไม่ต้องกังวล :)
Martin Ender

2
"การเล่นที่ดีที่สุด" ถูกกำหนดไว้อย่างดีหรือไม่? ถ้าเป็นเช่นนั้นคุณสามารถให้ลิงค์อธิบายอัลกอริทึมสำหรับการเล่นที่ดีที่สุดได้หรือไม่?
Rainbolt

2
@Rainbolt มันได้รับการแก้ไขและมีอัลกอริธึมที่สมบูรณ์แบบเช่นกัน อ่านWikipediaเพิ่มเติม
ghosts_in_the_code

คำตอบ:


16

Perl, 119 118 117 ไบต์

รวมถึง +4 สำหรับ -0p

ให้แผ่นกระดานหมุนที่มีช่องว่างบน STDIN (แรงโน้มถ่วงดึงหินไปทางขวา)

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

พิมพ์3หากผู้เล่นที่จะย้ายชนะ1ถ้าผู้เล่นที่จะย้ายสูญเสียและ2สำหรับการวาด

คุณสามารถใช้ตัวอักษร^Sเพื่อรับหนึ่งไบต์ หากคุณไม่รังเกียจความไร้ประสิทธิภาพอย่างสุดขีดคุณสามารถออกจาก$$_||=(ตารางการย้ายข้อมูล) และรับเพิ่มอีก 6 ไบต์ หากคุณปล่อยออกไป$_=มันจะแสดงตำแหน่งที่จะเล่นแทนผลลัพธ์ (เล่นบน1และชนะหากมีหนึ่งเล่น2และวาดถ้ามีหนึ่งหรือเล่นใด ๆ3และแพ้)

สร้างและประเมินทรี minimax ที่สมบูรณ์ คุณจะใช้หน่วยความจำและเวลาหมดเว้นแต่ว่าบอร์ดจะเต็มไปด้วยความสมเหตุสมผลแล้ว


2
ทำไมบางคนบนโลกใบนี้ถึงลงคะแนนลง? สนามกอล์ฟที่น่าตื่นตาตื่นใจอย่างแท้จริง (ฉันกอล์ฟกับ Perl และการได้รับการแก้ปัญหาดังกล่าวเป็นextremlyยาก - ผมไม่แน่ใจว่า Perl อื่น ๆ นักกอล์ฟฉันรู้ว่าจะได้มากับรหัสที่) และรหัสมีพฤติกรรมที่จำเป็น
Dada

นี่ทำให้สมองของฉันเจ็บ +1!
levelonehuman

@Dada คุณรู้ได้อย่างไรว่าคำตอบนี้ลงคะแนน? ฉันเห็นว่า 3 คะแนน ...
RosLuP

@RosLuP เมื่อฉันเห็นโพสต์นี้ครั้งแรกมันมี 1 downvote นอกจากนี้เมื่อคุณมีตัวแทนมากพอคุณสามารถดูว่ามีการโพสต์โหวตของคุณมากน้อยเพียงใด: ในกรณีนี้ตอนนี้มี 4 คนขึ้นไป 1 คน
Dada
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.