Mükemmel bir Mu Torere oyunu oyna


14

Arka fon

Mu Torere, Avrupa etkisinden önce Yeni Zelanda'daki Maori halkı tarafından oynandığı bilinen sadece iki oyundan biri. Bu, oyunu "objektif kazanma ölçütü" ne ve mevcut diğer oyunlardan farklı oyun kurallarına sahip olması açısından benzersiz bir oyun haline getiriyor.

Oynanış:

Tahta bir sekizgendir. Her bitişik tepe arasında bağlantılar vardır ve tüm köşelere bağlı bir merkez düğüm vardır. Herhangi bir zamanda, dokuz düğümden sekizi taşlarla işgal edilir. Başlangıçta, ortadaki düğüm boş olan sekizgenin yarısını kaplayan dört beyaz taş ve dört siyah taş vardır. Önce siyah hareket eder.

Her turda, oyuncu taşlarından birini 16 kenardan biri boyunca bir düğümden boş düğüme taşıyabilir. Bir taş ancak dış rakipten ortadaki düğüme taş taş rakibin taşının yanındaysa taşınabilir.

Bir oyuncu, boş düğüme bir taş bağlayan kenar olmadığında meydana gelen yasal bir hamle yapamadığı zaman kaybeder.

Diyagram ve kuralların açıklaması

İşte kuralları (şema ile) açıklayan ve bazı analizler sunan bir web sitesi.

Meydan okuma

Sizin meydan okuma Mu Torere bir insan rakibe karşı mükemmel bir oyun oynayabilir en kısa programı yazmaktır. Programınız oyun tahtasını görüntüleyip güncelleyebilmeli, hamle yapabilmeli ve bir insan rakipten hamle alabilmelidir. En önemlisi, mükemmel bir oyun oynamalı.

Mükemmel Oyun?

Evet, mükemmel bir oyun. Biraz oyun analizi yapıyorum ve her iki tarafın da mükemmel oynadığı takdirde oyunun sonsuz bir süre sürdüğünü gördüm. Bu, programınızın asla kaybetmemesi gerektiği anlamına gelir. Ayrıca, insan rakip programın kazanmayı zorlamasına izin veren bir hata yaptığında programınız kazanmayı zorlayabilmelidir. Programınızın mükemmel hareketi nasıl bulduğuna gelince, bu size kalmış.

ayrıntılar

Her hamleden sonra (ve oyunun başında), programınız oyun tahtasını yazdırmalıdır. Ancak kartı görüntülemeyi seçerseniz, tüm düğümleri göstermeli ve tam olarak bağlı olmalıdır (16 bağlantı hattının tamamı çapraz çizgiler olmadan çizilmelidir). Başlangıçta, kartın doğru başlangıç ​​konumuna sahip olması gerekir. Bunu başarmanın bir yolu, oyun tahtasını kare yapmaktır.

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

İki renk siyah beyaz veya koyu / açık renktedir. Kurul hangi oyuncuların hangi oyuncuların hangi taşlarla dolu olduğunu göstermelidir, örneğin "b" veya "w" ile işaretlemek ve hangi düğümün boş olduğunu göstermek. Katılımcılar, oyun tahtasını düz metin yerine daha grafik yapmak için teşvik edilir (ancak zorunlu değildir).

Oyun tahtanızda her bir düğüme benzersiz bir sayı veren bir numaralandırma sistemi olmalıdır. Tahtayı istediğiniz gibi numaralandırmayı seçebilirsiniz, ancak cevabınızda veya program tarafından açıklanmalıdır. Kare tahta aşağıdaki gibi numaralandırılabilir:

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

İlk hareket eden insandır. Onun girdisi tek bir sayı olacak. Bu, taşınan taşın şu anda olduğu düğüm sayısı olacaktır. Bir taşı 4. düğümden boş bir düğüme 5 taşımak istersem, a yazacağım 4. 5, tek boş düğüm olduğu için ima edilir.

İnsanların her zaman yasal bir hamle yapacağını varsayın.

İnsan harekete geçtikten sonra, güncellenmiş bir tahta basılmalıdır. Programınız yasal bir hamleye karar verdikten sonra, güncellenmiş başka bir tahta yazdırmalı ve daha sonra insanın başka bir hamle girmesini beklemelidir.

Programınız kazandıktan sonra sona ermelidir.

notlar

Standart kod golf kuralları geçerlidir, harici dosyalara erişim vb. Yoktur. Ayrıca, programınızın her hareketini yapması için 15 saniyelik (makul bir makinede) esnek bir zaman sınırı koyacağım. Belirtildiği gibi, bu oyun sonsuz döngüler oluşturma olanağına sahiptir ve sonsuz bir döngüye giren derinlik-ilk aramayı istemiyorum.


2
Büyük zorluk. Yalnızca "İnsan yasadışı bir hamle girdiyse, programınız beklemeli ve farklı bir hamle girmesine izin vermelidir." bana biraz golf gibi geliyor: yasadışı girdiler durumunda davranışı tanımsız bırakamaz mıyız?
saatin tersi yönde dönmeyi bıraktı

1
Bu gereksinimi son dakikada attım ve sanırım ortadan kaldırsak iyi olur. Bu, zaten kazanmamaya mahkum olan insan için daha zor hale getirir. :)
PhiNotPi 28:12

1
Her zaman yasal bir hamleye girmek o kadar zor değil ... Bu arada, oldukça ayrıntılı bir analizden sonra 1.5'ten fazla hamle aramak için gereksiz olduğunu düşünüyorum. Bu yaklaşımın en kısa olup olmadığı başka bir sorudur.
Peter Taylor

3
Bağlantı verilen web sitesi artık kullanılamıyor, arşivlenen bir sürümün bağlantısı haline getirmek daha iyi olur.
Tally

Yanıtlar:


6

Yakut, 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

Oyun ağacını doğrudan hesaplayan yakut bir uygulama (oldukça kod alır) ve böylece her zaman en uygun şekilde oynar. Kart konumları aşağıdaki şekilde gösterildiği gibi dışa doğru çekilir:

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

5

bash ve arkadaşları ( 463447 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

İnsan bbilgisayar gibi oynar w. Tahta pozisyonu üstteki dokümanda olduğu gibi numaralandırılmıştır. Mükemmel bir oyun oynamak için buluşsal yöntemlerin şaşırtıcı derecede basit olduğu ortaya çıkıyor.

Öte yandan, ilginç yolu kaybetmek oldukça zordur. http://ideone.com/sXJPy bu bota karşı mümkün olan en kısa intiharı göstermektedir. Sondaki ekstra 0 değerinin döngüden doğru bir şekilde kopup kopmadığını test etmek olduğunu unutmayın.


Not read xZorunlu hale getirerek bir karakteri kurtarabilirdim , ama bu testi oldukça sinir bozucu hale getirir. Tahtadan sonra boş satırı kaldırarak bir karakteri de kurtarabilirdim, ama ...
Peter Taylor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.