틱택 토러스의 최적 게임


31

이 도전은 Tic Tac Toe 게임에 관한 것이지만 원환에서 재생됩니다.

게임 방법

필요한 게임 보드를 만들려면 일반 Tic Tac Toe 게임 보드로 시작하십시오. 먼저 왼쪽과 오른쪽 가장자리를 결합하여 실린더로 접습니다. 그런 다음 상단과 하단 가장자리를 결합하여 원환 체로 접습니다. 다음은 몇 가지 동작을 사용한 게임 보드의 간단한 시각화입니다 (Sick Paint skills!).

박하 사탕

원환 체에서 박하 사탕 발가락의 규칙은 일반 박하 사탕 발가락과 동일합니다. 각 플레이어는 X와 Os를 번갈아 놓습니다. 행, 열 또는 대각선에 3 개의 동일한 기호가있는 첫 번째가 이깁니다.

원환 체는 시각화하기가 매우 어렵 기 때문에 보드를 종이에 다시 투영합니다. 이제 일반 박하 사탕 발가락으로 게임을 할 수 있습니다. 유일한 차이점은 깨진 대각선으로 3 개의 동일한 기호로 이길 수도 있다는 것입니다. 예를 들어 플레이어 1 (X)이 다음 보드에서 승리합니다. 원환 체의 뷰를 약간 변경하여 쉽게 볼 수 있습니다.

하나의 깨진 대각선으로 3 개의 X로 인해 플레이어 1 (X)이 승리

관심이 있으시면 Torus Games 의 Torus에서 Tic Tac Toe를 재생할 수 있습니다 . Windows, Mac 및 Android 버전이 있습니다.

최적의 게임

이 도전에서 최적의 게임에 관심이있었습니다. 최적의 게임은 두 플레이어 모두 최적의 전략을 수행하는 게임입니다. 일반 박하 사탕 발가락 보드에서 최적의 게임은 항상 무승부로 끝납니다. 흥미롭게도 원환 판에서 항상 첫 번째 플레이어가 승리합니다. 실제로 원환 판의 게임은 무승부로 끝날 수 없습니다 (플레이어가 최적이 아닌 경우).

최적의 전략은 정말 쉽습니다.

  • 당신이 당신의 상징을 배치하여 이길 수 있다면 그것을하십시오.
  • 그렇지 않으면 상대방이 한 행 / 열 / điagonal에 두 개의 기호가 있으면 그를 차단하십시오. 그렇지 않으면 원하는 것을하십시오.
  • 그렇지 않으면 원하는 것을하십시오.

모든 최적의 게임은 정확히 7 개의 동작으로 구성되며 이러한 동작은 다음과 같은 방식으로 설명 할 수 있습니다.

  1. 플레이어 1은 보드의 어느 곳에 나 X를 놓습니다 (9 가지 선택)
  2. 플레이어 2는 보드의 어느 곳에 나 O를 배치합니다 (8 가지 선택)
  3. 플레이어 1은 보드의 어느 곳에 나 X를 배치합니다 (7 가지 선택).
  4. 2 번 선수의 움직임은 강요 될 수 있으며 (1 선택), 그렇지 않은 경우 O를 어디에나 배치합니다 (6 선택)
  5. 플레이어 1의 이동이 강제됩니다 (1 선택)
  6. 2 번 선수는 포크로 잡히고 (1 번 선수는 두 가지 방법으로 승리 할 수 ​​있습니다) 2 번 선수는 1 번 선수를 한 방향으로 막아야합니다 (2 가지 선택)
  7. 1 번 선수가 마지막으로 이기고 승리 (1 선택)

프로젝트 보드에는 9 * 8 * 1 * 6 * 1 * 2 * 1 + 9 * 8 * 6 * 1 * 1 * 2 * 1 = 1728 개의 서로 다른 최적 게임이 있습니다. 여기서 당신은 하나의 전형적인 최적의 게임을 볼 수 있습니다 :

최적의 게임 예

보드의 각 셀에 숫자로 레이블을 붙이면 0-8이 게임을 숫자로 설명 할 수 있습니다 3518207. 먼저 X는 셀 3의 가운데 (중앙 행, 왼쪽 열), 셀 5의 O (중앙 행, 오른쪽 열)보다, 셀 1의 X (상단, 가운데 열)보다 ...

이 숫자 표기법을 사용하여 자동으로 주문을 생성했습니다. 이제 1728 개의 최적 게임을 모두 정렬하고 목록을 얻을 수 있습니다.

Game 0000: 0123845
Game 0001: 0123854
Game 0002: 0124735
Game 0003: 0124753
Game 0004: 0125634
   ...
Game 0674: 3518207
   ...
Game 1000: 5167423
Game 1001: 5167432
Game 1002: 5168304
   ...
Game 1726: 8765034
Game 1727: 8765043

도전

이 목록은 직업의 일부입니다. 당신은 k0에서 1727 사이의 숫자를 받게 될 것이고 당신은 k그 정렬 된 목록의 숫자 표기법으로 게임 을 돌려 주어야 합니다.

숫자 k(정수) 를 수신 하여 해당 게임을 계산 하는 함수 또는 프로그램을 작성하십시오 . STDIN, 명령 줄 인수, 프롬프트 또는 함수 인수를 통해 입력을 읽고 결과 (7 자리)를 읽을 수있는 형식 (예 : 0123845또는 [0, 1, 2, 3, 8, 4, 5])으로 인쇄하거나 문자열 (사람이 읽을 수있는 형식) 또는 정수 (모두 포함)를 사용하여 반환 할 수 있습니다 기본 10) 또는 모든 배열 / 목록 형식의 숫자입니다.

챌린지 유형은 코드 골프입니다. 따라서 가장 짧은 코드가 승리합니다.


플레이어 2의 첫 번째 이동이 플레이어 1의 첫 번째 이동과 동일한 행 또는 열에 있어야하는 이유는 무엇입니까? 나는 선수 2의 첫 번째 움직임이 같은 대각선 중 하나에 있고 동일한 최적의 게임 패턴을 따르는 머리에서 몇 가지 게임을했습니다. 토 로이드 보드의 측면 중 하나는 행, 열 및 대각선이 게임에 대칭 효과를 갖는 것 같습니다.
Runer112

@ Runer112 최적의 전략을 많이 단순화했습니다. 유일한 규칙은 지금 당신이 할 수 있다면 상대방을 차단하는 것입니다, 그렇지 않으면 당신이 원하는 것을하십시오.
Jakube

7
단지 한마디로 말하면, 실제로 여기에는 가능한 독특한 게임이 훨씬 적습니다. 평행 이동 대칭은 첫 번째 이동의 위치를 ​​관련이 없습니다 (항상 뷰를 중앙에 놓을 수 있기 때문에) .9로 나눕니다. 보드를 회전하면 두 개의 다른 두 번째 이동 (대각 또는 인접한 사각형)이 발생합니다. 최대 48 개의 독특한 게임. 반사 대칭을 고려하면 훨씬 더 낮아집니다. 이 원환 체 버전은 일반 버전보다 훨씬 지루합니다. 멀리 골프.
오리온

@orion 실제로 토러스가 감싸고 있다는 사실은 우리가 '0'을 토러스 보드의 '첫 번째'rect로 생각하는 것을 금지하지 않으며 일반적으로 9 개의 필드를 모두 구별합니다. 지구 반대편에는 목요일에 한 다리, 수요일에 한 다리는 수요일 (현지 시간의 24 시간 차이)이 될 수 있습니다. 그리고 지구가 둥글고없는 사실에도 불구하고 모두 "시작점"...
pawel.boczarski

@Rodney Nope, 7이 아닌 1입니다. 계산해보십시오.
Jakube

답변:


6

자바 스크립트 (ES6) 266 308 317 334 341

문자열을 반환하는 함수입니다. 편집 함수 M에 대한 산술 솔루션을 찾았습니다.

F=(n,x=[],M=(a,b,t=-a-b)=>(a-b)%3?a<3&b<3?3+t:a>5&b>5?21+t:12+t:9+t+a%3*3)=>
[for(a of z='012345678')for(b of z)for(c of z)for(d of z) 
a-b&&c-a&&c-b&&(b-(y=M(a,c))?d==y:d-a&&d-b&&d-c)&&(
f=M(c,e=M(b,d)),g=M(a,e),g<f?[f,g]=[g,f]:0,r=a+b+c+d+e,x.push(r+f+g,r+g+f))]
&&x[n]

매우 순진한 방법으로 여러 가지 방법으로 단축 될 수 있습니다 . 그것은 가능한 모든 법적 가치를 열거하고 n에서 찾은 것을 반환합니다. M 함수는 두 셀 사이의 위치, 즉 상대 플레이어를 차단하기위한 필수 이동을 반환합니다.

더 읽기

F=(n,x=[],
  M=(a,b,t=-a-b)=>(a-b)%3? 
     a<3&b<3?
       3+t // first row
       :a>5&b>5?
          21+t // last row
          :12+t // middle row and diags
     :9+t+a%3*3 // columns
  )=>
  [for(a of z='012345678') // enumerate the first 4 moves
     for(b of z)
       for(c of z)
         for(d of z) 
           a-b&&c-a&&c-b // avoid duplicates
           &&(b-(y=M(a,c))?d==y:d-a&&d-b&&d-c) // and check if d must block a-c or it's free
           &&(
             e=M(b,d), // forced to block b-d
             f=M(c,e),g=M(a,e),g<f?[f,g]=[g,f]:0, // f and g could be in the wrong order
             r=a+b+c+d+e, // start building a return string
             x.push(r+f+g,r+g+f) // store all values in x
  )]&&x[n] // return value at requested position

3

옥타브, 467 336263309297

297 :

global t=0*(1:9)m=dec2bin([15;113;897;1170;1316;1608;2370;2216;2580])-48 a;
function g(s,p)global a t m;
if nnz(s)<8&&any((t==1)*m>2)a=[a;s];return;end;q=t==3-p;
(r=sort(~q.*(1:9)*m(:,find([3 1]*([q;t==p]*m)==6)')))||(r=find(~t));
for i=r t(i)=p;g([s i+47],3-p);t(i)=0;end;end;g('',1);f=@(n)a(n+1,:);

유일한 관련 변경 사항은 현재 플레이어가 이길 수 있는지 확인하지 않고 상대방이 다음 턴에서 이길 가능성 만 확인한다는 것 입니다. 으로 (가) 만 이길 수있는 선수 1 차례는 7 차례 ,이 알고리즘이 최적이 아닌 게임을 생성 할 수있는 유일한 장소이지만, 이러한 상황을 필터링하는 것은 매우 쉽습니다. 우리는 단순히 플레이어 1이 이기면 생성 된 각 게임을 확인합니다. 그렇지 않은 경우 7 번의 이동이 잘못되었으므로이 게임을 최적의 게임 테이블에 추가하지 않습니다.

(이 규칙에 의해 생성 된 게임의 정확히 절반은 거짓 입니다. 즉 , 7 번째 턴에서 플레이어 1은 항상 플레이어 2를 막을 수있는 두 가지 가능성이 있지만, 오직 한 명만이 그를 즉시 이길 수 있습니다).

용도:

$ octave
octave:1>> source script.m
octave:2>> f(634)
ans = 3270148

ungolfed 코드는 다음과 같습니다.

 global t=0*(1:9);
 global m=dec2bin([15;113;897;1170;1316;1608;2370;2216;2580])-48;
 global allgames;
 allgames=[];

 function r=canbewon(by)
  global t m
  q=[t==by;t==(3-by)]*m;
  g=(find([3 1]*q==6))';
  r=sort((~(t==by).*(1:9)) * m(:,g));
 end

 function games_starting_with(s)
 global allgames t;
 if 7==numel(s) && any((t==1)*m==3) # it's 7th move and first player won
  allgames=[allgames;s];
  return;
 end;
 poss=(find(~t));                  # for now all free slots are possible
 player=1+mod(numel(s),2);
 moves = canbewon(3-player);
 if numel(moves) poss=moves; end;  # ... no, we must block the other player
 for i=poss
  t(i)=player;
  games_starting_with([s char(i+47)]);
  t(i)=0;
 end
end

games_starting_with('');
f=@(n)(allgames(n+1,:));

1
작은 힌트 : 이전 버전이 동일한 로직을 사용하는 경우 편집 히스토리에 저장되므로 여전히 사용할 수 있으므로 이전 버전을 잘라낼 수 있습니다
masterX244
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.