칙칙한 틱택 토


19

선택한 언어로 프로그램을 작성하여 인간 플레이어를 상대로 3 * 3 보드에서 틱택 토 게임을하십시오. 그러나 모든 이동은 이전 반복에서 생성 된 다른 프로그램이어야합니다 .

인간 입력을 평가하는 방법과 형태는 사용자에게 달려 있지만 표준 입력에서 읽어야합니다. 마찬가지로, 어떤 선수의 시작을 결정하는 방법을 자유롭게 선택할 수 있습니다 (예를 들어, 먼저 요청하거나 사람이 컴퓨터가 시작했다는 신호 또는 다른 아이디어를 나타내는 잘못된 움직임을 입력하도록 허용).

움직임을 검증 할 필요는 없습니다. 당신은 상당히 상대적인 사람을 상대한다고 가정 할 수 있습니다.

기본적으로 보드의 상태에 해당하는 프로그램이 있습니다. 상태는 인식 가능한 방식으로 인쇄되지만 최소한 다음과 같은 세부 수준이 예상됩니다.

X..
00X
x..

휴먼 플레이어가 자신의 움직임을 입력 한 후, 프로그램은 동일한 언어 (표준 출력 또는 파일)로 소스 파일로 다음 반복을 생성하고 종료해야합니다. 해당 소스 파일 이외의 다른 곳에 정보를 저장할 수 없습니다. (프로그램에서 생성 된 프로그램을 빌드하고 실행할 필요는 없으며 사용자가 수행 할 수 있지만 금지되지는 않습니다). 생성 된 프로그램이 빌드되고 실행될 때 유사하게 작동하고 상태를 표시하며 사용자 입력을 기다리는 등

게임이 끝날 때, 당신은 확실하게 식별 할 수있는 방식으로 결과를 얻어야합니다.

완벽하게 플레이한다는 것은 프로그램을 잃어서는 안된다는 뜻이며, 이길 수있는 가능성이 있다면 승리해야합니다.

가장 짧은 코드가 이기고 , 첫 번째 유효한 입력 후 최소 10 일 후에 우승자가 선택됩니다.

프로그램이 다음 반복의 빌드 및 시작을 처리 할 수 ​​있으면 점수가 10 % 감소합니다. 물론 그럴만 한 가치가 없을 것입니다. 물론 다음 번 반복에서 사용자의 이동을 수락 할 때까지 프로그램 자체를 종료해야합니다.

이상한 이상한 트릭을 사용하는 경우 코드와 함께 간단한 설명을 게시하십시오.


2
좋은 도전이지만 선택을 거부 할 것 같습니다.
John Dvorak

"모든 이동은 다른 프로그램이어야합니다". "각 게임은 원래 프로그램의 새롭고 뚜렷한 인스턴스에 의해 시작되고 관리되어야합니다"를 의미합니까?
DavidC

1
@DavidCarraher : 아니요. 모든 게임뿐만 아니라 모든 움직임. 보드 예 아래의 설명을 확인하십시오. 컴퓨터가 이동해야 할 경우 (보드 상태가 변경됨) 프로그램은 빌드 및 실행시 다음 상태가되는 소스 파일을 생성해야합니다. 그런 다음 원래 프로그램이 종료됩니다. 새로 생성 된 프로그램은 이동시 유사하게 작동합니다. 빌드 및 실행시 다음 상태가되는 소스 파일을 작성하는 등의 방식으로 작동합니다. 생성 된 소스 파일을 제외하고 정보 저장이 허용되지 않기 때문에 반복 간의 차이가있는 퀴인과 같습니다.
vsz

답변:


13

펄, 933 자

$m=<<'';$_='         ';
sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

스크립트 중간의 빈 줄은 실제로 있어야합니다. (긴 줄 끝에있는 줄 바꿈은 가독성을 위해 필요하지 않으며 문자 수에 포함되지 않습니다.)

사용법 : 프로그램을 인수없이 실행하면 현재 게임 상태가 표시됩니다. 시작시 보드가 비어 있으므로 출력은 다음과 같습니다.

...
...
...

1에서 9 사이의 인수로 프로그램을 실행하여 해당 사각형을 이동으로 주장하십시오. 프로그램은 자체적으로 이동 한 다음 새로운 상태의 대체 스크립트를 출력합니다. 따라서 예를 들면 다음과 같습니다.

$ perl ./qttt 5 > ./qttt-2
$ perl ./qttt-2
O..
.X.
...

첫 번째 턴에서만 0컴퓨터가 첫 번째로 움직여야한다는 표시를 할 수 있습니다. 첫 번째 플레이어는 항상입니다 X.

게임이 끝나면 디스플레이 출력에 해당 효과에 대한 메모가 포함됩니다.

$ perl ./qttt-4 6 > ./qttt-5
$ perl ./qttt-5
O wins
OXX
OOX
X.O

이 프로그램은 게임 트리의 표준 미니 맥스 검색을 통해 작동합니다. (tic-tac-toe는 실행 시마다 전체 게임 트리를 생성 할 수있는 작은 게임입니다.) 예외는 컴퓨터가 먼저 움직일 때입니다. 코딩되었습니다.

이 프로그램은 적절한 quine 방식으로 작동한다는 점에 유의하십시오. 스크립트는 출력을 생성하기 위해 자체 소스 파일에 액세스하지 않습니다.


1
저거 정말 예쁘다! 나는 내가 오랫동안 여기 큰 문서를 쳐다보고 있다는 것을 몰랐다.
Jesse Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.