Mainkan game Mu Torere yang sempurna

14

Latar Belakang

Mu Torere adalah permainan yang merupakan satu dari hanya dua yang diketahui dimainkan oleh orang-orang Maori Selandia Baru sebelum pengaruh Eropa. Ini membuatnya menjadi game yang sangat unik karena memiliki "kriteria kemenangan objektif" dan aturan main yang berbeda dari kebanyakan game lain yang ada.

Gameplay:

Papan adalah segi delapan. Ada koneksi antara masing-masing simpul yang berdekatan, dan ada simpul tengah yang terhubung ke semua simpul. Kapan saja, delapan dari sembilan node ditempati oleh batu. Pada awalnya, ada empat batu putih dan empat batu hitam yang masing-masing mengambil setengah dari segi delapan, dengan simpul tengah kosong. Hitam bergerak lebih dulu.

Setiap belokan, pemain dapat memindahkan salah satu batunya di sepanjang salah satu dari 16 tepi dari satu simpul ke simpul kosong. Sebuah batu hanya bisa dipindahkan dari simpul luar ke simpul tengah jika batu itu berada di sebelah batu lawan.

Seorang pemain kehilangan ketika dia tidak dapat melakukan langkah hukum, yang terjadi ketika tidak ada ujung yang menghubungkan batu ke simpul kosong.

Diagram dan penjelasan aturan

Berikut adalah situs web yang menjelaskan aturan (dengan diagram) dan menawarkan beberapa analisis.

Tantangan

Tantangan Anda adalah menulis program terpendek yang dapat memainkan permainan Mu Torere yang sempurna melawan lawan manusia. Program Anda harus dapat menampilkan dan memperbarui papan permainan, melakukan gerakan dan menerima gerakan dari lawan manusia. Yang paling penting, itu harus memainkan permainan yang sempurna.

Game Sempurna?

Ya, game sempurna. Saya telah melakukan beberapa analisis gim, dan saya menemukan bahwa gim ini bertahan selama waktu tak terbatas jika dimainkan dengan sempurna oleh kedua belah pihak. Ini berarti program Anda tidak boleh hilang. Selain itu, program Anda harus dapat memaksa menang setiap kali lawan manusia melakukan kesalahan yang memungkinkan program untuk memaksa menang. Adapun cara program Anda menemukan langkah yang sempurna, ini terserah Anda.

Detail

Setelah setiap gerakan (dan di awal permainan), program Anda harus mencetak papan permainan. Namun Anda memilih untuk menampilkan papan, itu harus menunjukkan semua node dan sepenuhnya terhubung (semua 16 jalur koneksi harus ditarik tanpa garis silang). Pada awalnya, papan harus memiliki posisi awal yang benar. Salah satu cara untuk mencapai ini adalah dengan membuat papan permainan persegi.

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

Dua warna tersebut adalah hitam dan putih, atau gelap / terang. Papan harus menunjukkan simpul mana yang ditempati oleh potongan pemain mana, seperti menandainya dengan "b" atau "w", dan simpul mana yang kosong. Peserta didorong (tetapi tidak diharuskan) untuk membuat papan permainan lebih grafis, daripada teks biasa.

Papan permainan Anda harus memiliki sistem penomoran yang memberikan setiap simpul nomor unik. Anda dapat memilih untuk memberi nomor papan apa saja yang Anda suka, tetapi harus dijelaskan dalam jawaban Anda atau oleh program. Papan kotak dapat diberi nomor sebagai berikut:

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

Manusia adalah yang pertama bergerak. Masukannya akan menjadi satu nomor. Ini akan menjadi jumlah simpul di mana batu yang dipindahkan saat ini berada. Jika saya ingin memindahkan batu dari simpul 4 ke simpul kosong 5, saya akan mengetikkan a 4. 5 tersirat karena merupakan satu-satunya simpul kosong.

Asumsikan bahwa manusia akan selalu membuat langkah hukum.

Setelah manusia bergerak, papan yang diperbarui harus dicetak. Setelah program Anda memutuskan langkah hukum, itu akan mencetak papan lain yang diperbarui, dan kemudian menunggu manusia untuk masuk ke langkah lain.

Program Anda harus berakhir setelah menang.

Catatan

Aturan golf kode standar berlaku, tidak boleh mengakses file eksternal, dll., Dll. Selain itu, saya akan menetapkan batas waktu fleksibel 15 detik (pada mesin yang masuk akal) agar program Anda membuat setiap gerakannya. Seperti yang dinyatakan, permainan ini memiliki kemungkinan untuk membentuk loop tak terbatas, dan saya tidak ingin pencarian mendalam-pertama masuk ke loop tak terbatas.

PhiNotPi
sumber
2
Tantangan besar. Hanya "Jika manusia memasukkan langkah ilegal, maka program Anda harus menunggu dan mengizinkannya memasukkan langkah lain." tampaknya agak tidak golf-ish bagi saya: tidak bisakah kita membiarkan perilaku tidak terdefinisi dalam kasus input ilegal?
Berhenti menghidupkan counterclock
1
Saya melemparkan persyaratan itu pada menit terakhir, dan saya kira tidak apa-apa jika kita menghilangkannya. Itu hanya membuat lebih sulit bagi manusia, yang sudah ditakdirkan untuk tidak menang. :)
PhiNotPi
1
Ini bukan yang sulit untuk selalu memasukkan langkah hukum ... By the way, setelah analisis yang cukup rinci Saya pikir itu tidak perlu untuk mencari lebih dari 1,5 langkah ke depan. Apakah pendekatan itu yang terpendek adalah pertanyaan lain.
Peter Taylor
3
Situs web tertaut tidak tersedia lagi, akan lebih baik untuk mengubahnya menjadi tautan ke versi yang diarsipkan.
Tally

Jawaban:

6

Ruby, 390 karakter

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

Implementasi dalam ruby ​​yang secara langsung menghitung pohon permainan (yang membutuhkan beberapa kode) dan karenanya selalu bermain secara optimal. Posisi papan berputar ke luar seperti yang ditunjukkan pada gambar berikut:

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

bash and friends ( 463 447 karakter)

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

Manusia berperan sebagai bkomputer w. Posisi dewan diberi nomor seperti pada dokumen di sini di bagian atas. Ternyata heuristik untuk memainkan permainan yang sempurna ternyata sangat sederhana.

Di sisi lain, kehilangan jalan yang menarik cukup sulit. http://ideone.com/sXJPy menunjukkan kemungkinan bunuh diri sesingkat mungkin terhadap bot ini. Perhatikan bahwa 0 ekstra di akhir adalah untuk menguji apakah ia keluar dari loop dengan benar.

Peter Taylor
sumber
NB Saya bisa menyelamatkan satu karakter dengan membuat read xwajib, tapi itu akan membuat pengujian cukup membuat frustrasi. Saya juga bisa menyelamatkan karakter dengan menghapus garis kosong setelah papan, tapi ...
Peter Taylor