Mu Torere의 완벽한 게임을 즐기십시오


14

배경

Mu Torere는 유럽의 영향을 받기 전에 뉴질랜드의 마오리 사람들이 플레이하는 것으로 알려진 두 가지 게임 중 하나입니다. 이것은 "객관적인 승리 기준"과 기존의 다른 게임과는 다른 규칙을 가지고 있다는 점에서 매우 독특한 게임입니다.

게임 플레이 :

보드는 팔각형입니다. 인접한 각 정점 사이에는 연결이 있으며 모든 정점에 연결된 중앙 노드가 있습니다. 어느 시점에서든 9 개의 노드 중 8 개가 돌로 채워져 있습니다. 처음에는 4 개의 흰 돌과 4 개의 검은 돌이 있는데, 각 돌은 팔각형의 절반을 차지하며 중앙 노드는 비어 있습니다. 검은 색이 먼저 움직입니다.

플레이어는 매 턴마다 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

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이 추가되면 루프에서 올바르게 끊어 졌는지 테스트하는 것입니다.


NB 필자는 read x강제로 하나의 캐릭터를 구할 수 있었지만 테스트는 상당히 실망 스러웠습니다. 보드 뒤에 빈 줄을 제거하여 캐릭터를 구할 수도 있었지만 ...
Peter Taylor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.