เล่นเกมที่สมบูรณ์แบบของ Mu Torere


14

พื้นหลัง

Mu Torere เป็นเกมที่เป็นหนึ่งในสองเกมที่ชาวเมารีในนิวซีแลนด์เล่นกันก่อนที่จะมีอิทธิพลต่อชาวยุโรป สิ่งนี้ทำให้มันเป็นเกมที่ไม่เหมือนใครซึ่งมี "เกณฑ์การชนะอย่างมีวัตถุประสงค์" และกฎการเล่นที่แตกต่างจากเกมอื่น ๆ ที่มีอยู่

เกม:

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

ในแต่ละเทิร์นผู้เล่นสามารถเคลื่อนหินหนึ่งอันของเขาไปตามหนึ่งใน 16 ขอบจากโหนดหนึ่งไปยังโหนดเปล่า หินสามารถเคลื่อนย้ายได้จากโหนดด้านนอกไปยังโหนดศูนย์กลางหากหินอยู่ติดกับหินของฝ่ายตรงข้าม

ผู้เล่นเสียเมื่อเขาไม่สามารถเคลื่อนไหวได้อย่างถูกกฎหมายซึ่งเกิดขึ้นเมื่อไม่มีขอบเชื่อมต่อก้อนหินกับโหนดว่างเปล่า

แผนภาพและคำอธิบายของกฎ

นี่คือเว็บไซต์ที่อธิบายกฎ (พร้อมแผนภาพ) และเสนอการวิเคราะห์

ความท้าทาย

ความท้าทายของคุณคือการเขียนโปรแกรมที่สั้นที่สุดที่สามารถเล่นเกมที่สมบูรณ์แบบของ Mu Torere กับคู่ต่อสู้มนุษย์ โปรแกรมของคุณควรสามารถแสดงและอัปเดตกระดานเกมเคลื่อนไหวและรับการเคลื่อนไหวจากฝ่ายตรงข้ามที่เป็นมนุษย์ สิ่งสำคัญที่สุดคือควรเล่นเกมที่สมบูรณ์แบบ

เกมที่สมบูรณ์แบบ?

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

รายละเอียด

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

w-w-w
|\|/|
b-o-w
|/|\|
b-b-b

สองสีคือขาวดำหรือมืด / สว่าง บอร์ดจะต้องแสดงว่าโหนดใดที่ครอบครองโดยชิ้นส่วนของผู้เล่นเช่นการทำเครื่องหมายด้วย "b" หรือ "w" และโหนดใดว่าง ผู้เข้าร่วมจะได้รับการสนับสนุน (แต่ไม่จำเป็น) เพื่อให้กระดานเกมมีกราฟิกมากกว่าข้อความธรรมดา

บอร์ดเกมของคุณควรมีระบบการกำหนดหมายเลขที่ทำให้แต่ละโหนดมีหมายเลขที่ไม่ซ้ำกัน คุณอาจเลือกที่จะจัดลำดับจำนวนบอร์ดตามที่คุณต้องการ แต่ควรอธิบายในคำตอบหรือโดยโปรแกรม กระดานสี่เหลี่ยมสามารถกำหนดหมายเลขได้ดังนี้:

1-2-3
|\|/|
4-5-6
|/|\|
7-8-9

มนุษย์เป็นคนแรกที่จะย้าย ข้อมูลของเขาจะเป็นตัวเลขเดียว นี่จะเป็นจำนวนโหนดที่ซึ่งหินเคลื่อนย้ายอยู่ในปัจจุบัน ถ้าผมต้องการที่จะย้ายหินจากโหนด 4 ไปยังโหนดที่ว่างเปล่า 5 4ผมจะพิมพ์ 5 เป็นนัยเนื่องจากเป็นโหนดว่างเปล่าเท่านั้น

สมมติว่ามนุษย์จะเคลื่อนไหวอย่างถูกกฎหมาย

หลังจากที่มนุษย์เคลื่อนไหวเขาก็ควรพิมพ์บอร์ดที่อัพเดตแล้ว หลังจากที่โปรแกรมของคุณตัดสินใจย้ายที่ถูกกฎหมายก็ควรพิมพ์บอร์ดที่อัปเดตใหม่แล้วรอให้มนุษย์เข้าสู่การเคลื่อนไหวอีกครั้ง

โปรแกรมของคุณควรยุติเมื่อได้รับรางวัล

หมายเหตุ

ใช้กฎมาตรฐานของรหัสกอล์ฟไม่มีการเข้าถึงไฟล์ภายนอก ฯลฯ และอื่น ๆ นอกจากนี้ฉันจะกำหนดเวลาที่ยืดหยุ่น 15 วินาที (ในเครื่องที่เหมาะสม) สำหรับโปรแกรมของคุณเพื่อให้แต่ละการเคลื่อนไหว ตามที่ระบุไว้เกมนี้มีความเป็นไปได้ในการสร้างลูปแบบไม่มีที่สิ้นสุดและฉันไม่ต้องการให้การค้นหาในระดับลึกเริ่มแรกเข้าสู่วงวนไม่สิ้นสุด


2
ความท้าทายที่ยิ่งใหญ่ เฉพาะ "ถ้ามนุษย์ป้อนการเคลื่อนไหวที่ผิดกฎหมายจากนั้นโปรแกรมของคุณควรรอและอนุญาตให้เขาป้อนการย้ายที่แตกต่างกัน" ดูเหมือนจะเป็นเรื่องที่ไม่ดีสำหรับฉัน: เราจะไม่ปล่อยพฤติกรรมที่ไม่ได้กำหนดไว้ในกรณีที่มีการป้อนข้อมูลที่ผิดกฎหมายหรือไม่?
หยุดหมุนทวนเข็มนาฬิกา

1
ฉันโยนความต้องการนั้นในนาทีสุดท้ายและฉันเดาว่ามันคงจะโอเคถ้าเราจะกำจัดมัน นั่นทำให้ยากขึ้นสำหรับคนที่ถึงวาระแล้วที่จะไม่ชนะ :)
PhiNotPi

1
มันไม่ได้เป็นที่ยากที่จะเสมอป้อนไปตามกฎหมาย ... โดยวิธีการที่หลังจากการวิเคราะห์รายละเอียดอย่างเป็นธรรมผมคิดว่ามันไม่จำเป็นที่จะค้นหามากกว่า 1.5 ย้ายไปข้างหน้า ไม่ว่าวิธีการนั้นจะสั้นที่สุดหรือไม่ก็เป็นอีกคำถามหนึ่ง
ปีเตอร์เทย์เลอร์

3
เว็บไซต์ที่เชื่อมโยงไม่สามารถใช้งานได้อีกต่อไปมันจะเป็นการดีกว่าถ้าจะเปลี่ยนเป็นลิงก์ไปยังเวอร์ชันที่เก็บถาวร
Tally

คำตอบ:


6

ทับทิม 390 ตัวอักษร

o=->s,c{f=s=~/o/;[*0..8].select{|t|s[t]==c&&(t<1||(t+6)%8+1==f||t%8+1==f||f<1&&(s[(t+6)%8+1]!=c||s[t%8+1]!=c))}.map{|t|k=s*1;k[f]=c;k[t]=?o;k}}
v=->s,c,h{f=o[s,c];f==[]?0:h<1?1:2-f.map{|t|v[t,c>?b??b:?w,h-1]}.min}
q=->g{puts"1-2-3\n|\\|/|\n8-0-4\n|/|\\|\n7-6-5\n".tr"0-8",g;$>.flush}
q[g="obbbbwwww"]
(g.tr!?o,?b;g[gets.to_i]=?o;q[g];q[g=o[g,?w].sort_by{|q|v[q,?w,5]}[-1]])while v[g,?b,5]>0

การใช้งานในทับทิมซึ่งคำนวณทรีเกมโดยตรง (ซึ่งต้องใช้รหัสบ้าง) จึงเล่นได้อย่างดีที่สุด ตำแหน่งของคณะกรรมการจะวนออกมาดังแสดงในรูปต่อไปนี้:

1 - 2 - 3
| \ | / |
8 - 0 - 4
| / | \ |
7 - 6 - 5

5

ทุบตีและเพื่อน ๆ ( 463 447 ตัวอักษร)

t(){ tr 0-8a-i $b$b
}
p(){ t<<E
0-1-2
|\|/|
3-4-5
|/|\|
6-7-8

E
}
g(){ b=`tr $x$e $e$x<<<012345678|t`
p
e=$x
}
b=bbbbowwww
e=4
m=0
p
while [ $m != 5 ]&&read x;do
g
m=0
for y in {0..8};do
s=0
S=05011234
grep -E "w.*($y$e|$e$y)"<<<${b:$y:1}30125876340142548746>/dev/null&&for p in wow.\*/ww wow.\*/w bbo.\*/b obb.\*/b www wbw .
do
((s++))
tr $y$e $e$y<<<3012587630/4e|t|grep $p>/dev/null&&break
done
s=${S:$s:1}
[ $s -gt $m ]&&m=$s x=$y
done
g
done

มนุษย์เล่นเป็นคอมพิวเตอร์เป็นb wตำแหน่งของคณะกรรมการมีหมายเลขตามเอกสารที่นี่ที่ด้านบน ปรากฎว่าฮิวริสติกในการเล่นเกมที่สมบูรณ์แบบนั้นเรียบง่ายอย่างน่าประหลาดใจ

ในทางกลับกันการสูญเสียเส้นทางที่น่าสนใจนั้นค่อนข้างยาก http://ideone.com/sXJPyสาธิตการฆ่าตัวตายที่สั้นที่สุดที่เป็นไปได้กับบอทนี้ โปรดทราบว่า 0 พิเศษในตอนท้ายคือการทดสอบว่ามันแยกออกจากวงได้อย่างถูกต้อง


NB ฉันสามารถบันทึกหนึ่งตัวละครโดยการทำread xภาคบังคับ แต่นั่นจะทำให้การทดสอบค่อนข้างน่าผิดหวัง ฉันยังสามารถบันทึกตัวอักษรโดยการลบบรรทัดว่างหลังจากที่คณะกรรมการ แต่ ...
ปีเตอร์เทย์เลอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.