Mu Torereの完璧なゲームをプレイする


14

バックグラウンド

Mu Torereは、ヨーロッパの影響を受ける前にニュージーランドのマオリの人々によってプレイされることが知られているたった2つのゲームの1つです。これにより、他のほとんどのゲームとは異なる「客観的な勝利基準」とプレイのルールがあるという点で非常にユニークなゲームになります。

ゲームプレイ:

ボードは八角形です。隣接する各頂点間に接続があり、すべての頂点に接続された中央ノードがあります。任意の時点で、9つのノードのうち8つが石で占められています。開始時には、4つの白い石と4つの黒い石があり、それぞれが八角形の半分を占めており、中央のノードは空です。黒が先に動きます。

各ターンで、プレイヤーは自分の石の1つを16のエッジの1つに沿って1つのノードから空のノードに移動できます。石は、相手の石の隣にある場合にのみ、外側のノードから中央のノードに移動できます。

プレーヤーは、石を空のノードに接続するエッジがないときに発生する合法的な移動ができない場合に負けます。

ルールの図と説明

以下は、ルールを説明する(図を使用して)いくつかの分析を提供するWebサイトです。

チャレンジ

あなたの課題は、人間の対戦相手に対してMu Torereの完璧なゲームをプレイできる最短のプログラムを書くことです。プログラムは、ゲームボードの表示と更新、移動、および人間の対戦相手からの移動を受信できる必要があります。最も重要なことは、完璧なゲームをプレイすることです。

完璧なゲーム?

はい、完璧なゲーム。私はいくつかのゲーム分析を行ってきましたが、両方で完全にプレイした場合、ゲームは無限の時間続くことがわかりました。これは、プログラムが決して失われないことを意味します。また、プログラムは、人間の対戦相手がミスを犯してプログラムに勝つことを許可するたびに、勝つことを強制できる必要があります。あなたのプログラムが完璧な動きを見つける方法に関しては、これはあなた次第です。

詳細

各移動後(およびゲームの開始時)、プログラムはゲームボードを印刷する必要があります。ただし、ボードの表示を選択した場合、すべてのノードが表示され、完全に接続されている必要があります(16本の接続線はすべて、交差線なしで描画する必要があります)。開始時には、ボードの開始位置が正しいはずです。これを達成する1つの方法は、ゲームボードを正方形にすることです。

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

2つの色は黒と白、または暗い/明るいです。ボードは、「b」または「w」でマークするなど、どのノードがどのプレーヤーの駒で占められているか、どのノードが空いているかを示す必要があります。参加者は、ゲームボードをプレーンテキストではなくグラフィカルにすることをお勧めします(ただし必須ではありません)。

ゲームボードには、各ノードに一意の番号を付与する番号システムが必要です。好きなようにボードに番号を付けることもできますが、回答またはプログラムで説明する必要があります。正方形のボードには、次のように番号を付けることができます。

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

人間が最初に動く。彼の入力は単一の数字になります。これは、移動した石が現在あるノードの番号になります。ノード4から空のノード5に石を移動したい場合は、と入力し4ます。5は唯一の空のノードであるため、暗示されています。

人間は常に合法的な動きをすると仮定します。

人間が移動した後、更新されたボードを印刷する必要があります。プログラムが合法的な動きを決定したら、更新された別のボードを印刷し、人間が別の動きを入力するのを待つ必要があります。

プログラムは勝ったら終了するはずです。

ノート

標準コードのゴルフ規則が適用され、外部ファイルへのアクセスなどは行われません。また、プログラムが各移動を行うための15秒の柔軟な制限時間(妥当なマシン上)を課します。述べたように、このゲームには無限ループを形成する可能性があり、深さ優先の検索が無限ループに入るのは望ましくありません。


2
大きな挑戦。「人間が違法な動きを入力した場合、プログラムは待機し、別の動きを入力できるようにする必要があります。」私には少しゴルフっぽくないようです:不正な入力があった場合に動作を未定義のままにしておくことはできませんか?
反時計回りに回るのをやめた

1
私はその要件を最後の最後で捨てましたが、それを排除しても大丈夫だと思います。それはただ、すでに勝てない運命にある人間にとって、それを難し​​くしているだけです。:)
PhiNotPi

1
常に合法的な動きを入力することはそれほど難しくありません...ところで、かなり詳細な分析の後、1.5動き以上先を検索する必要はないと思います。そのアプローチが最短かどうかは別の問題です。
ピーターテイラー

3
リンクされたWebサイトはもう利用できません。アーカイブバージョンへのリンクに変更することをお勧めします。
タリー14年

回答:


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

ゲームツリーを直接計算する(かなりのコードを必要とする)rubyの実装であり、常に最適に再生されます。次の図に示すように、ボードの位置は外側に向かって螺旋状になっています。

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

5

bash and friends(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は、ループから正しく抜けることをテストするためのものです。


注意:read x強制的にすることで1人のキャラクターを救うことができますが、それはテストを非常にイライラさせます。私はまた、ボードの後に空白行を削除することにより、文字が...救うことができる
ピーター・テイラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.