질서와 혼돈과 코드 골프


10

Order and Chaos 는 6x6 보드에서 재생되는 Tic-Tac-Toe의 변형입니다. 그러나 게임을 독특하게 만드는 것은 두 플레이어 모두 X 또는 O를 배치 할 수 있다는 것입니다! 매 턴 (주문으로 시작)마다 플레이어는 비어있는 사각형에 X 또는 O를 놓습니다.
승리는 간단합니다. 보드에 5 Xs 또는 Os (수직, 수평 또는 대각선)가 있으면 순서대로 승리합니다. 보드가 채워지고 보드에 5 Xs 또는 Os 문자열이 없으면 카오스가 승리합니다. 작업? 자, 이것이 Programming Puzzles and Code Golf이므로 게임을 프로그래밍하고 골프를칩니다.

규칙

  • 로 입력을 승인해야합니다 x y t. 위치 xy좌표이며 t타일 ​​유형 ( X또는 O)입니다. 좌표는 0 0왼쪽 위 모서리에서 시작하여 5 5오른쪽 아래 모서리 까지 증가합니다 .
  • 사용자가 유효하지 않은 좌표, 타일, 형식이 아닌 입력을 입력 하거나 타일이 이미있는 위치에 타일을 배치하려고 하면 q종료하고 인쇄하도록 허용해야합니다 . (이 경우 프로그램이 종료되므로 유일한 예외입니다 .)INVALIDx y tq
  • 주문이 이기면을 출력 P1 WINS합니다. 카오스가 이기면을 출력 P2 WINS합니다.
  • 먼저 주문해야합니다.
  • 공백은로 표시됩니다 ..
  • 타일은 XO(대문자). 소문자를 사용할 필요는 없지만 대문자가 필요합니다.
  • 보드는으로 만 구성되어야합니다 .XO.
  • 실제로 보드를받지 않고 누가 이겼는지 확인하면서 게임을하는 두 선수를 시뮬레이션하고 있습니다. 한 명의 플레이어가 이길 때까지 이동을 입력으로 받아 들인 다음 보드를 인쇄하고 다른 움직임을 받아들입니다.

시작 보드는 다음과 같습니다.

......
...... 
......
......
......
...... 

그리고 첫 번째 플레이어 (주문) 입력 후 1 2 X다음과 같아야합니다.

......
...... 
.X....
......
......
......  

마찬가지로 다음 플레이어 (Chaos)가 입력 3 3 O하면 다음과 같이 표시됩니다.

......
...... 
.X....
...O..
......
......  

그리고 이것은 한 선수가 이길 때까지 계속됩니다.

항상 그렇듯이 모든 것을 재미있게 만드는 표준 허점 은 금지되어 있습니다.

우승자는 6 월 15 일 00:00 UTC (이 챌린지가 게시 된 후 약 한 달)에 가장 짧은 코드를 가진 사람입니다.


플레이어가 이미 잡은 위치에 입력하면 어떻게 되나요?
Loovjo

@Loovjo 반환합니다 INVALID. 지금은 그것을 편집했습니다. 감사합니다.
ASCIIThenANSI

1
5 개의 타일이 연속으로 감지되면 게임이 종료되어야합니까?
Kyle Kanos

1
어쩌면 그것을 간과했지만 보드를 화면에 인쇄하거나 보드의 상태를 확인하고 어떤 플레이어가 이길 수 있습니까?
Kodos Johnson

@Andrew 저는 실제로 게임을 시뮬레이션하려고했습니다. 각 플레이어의 입력을 한 번에 한 차례 씩 수락 한 다음 각 플레이어가 이겼는지 확인합니다. 설명이 명확하지 않습니까?
ASCIIThenANSI

답변:


1

PHP, 316

여기 내 제출물이 있습니다. 커맨드 라인에서 PHP로 실행해야합니다.

이 코드는 내가 만든 바로 가기로 인해 알림을 생성합니다. 이것이 괜찮다면 알려주세요. 문자를 몇 개 더 추가하여 문제를 해결할 수 있습니다. 이 페이지를 확인 했으며 오류에 대한 언급이 없으면 오류보고가 꺼져 있다고 가정합니다.

<?for(;$i++<6;)$b.='......|';while(($a=trim(fgets(STDIN)))!='q'){preg_match('/^([0-5]) ([0-5]) ([XO])$/',$a,$d)&($b[$c=$d[2]*7+$d[1]]=='.')?$b[$c]=$d[3]:print"INVALID\n";echo str_replace("|","\n",$b); foreach([0,5,6,7]as$e)preg_match('/(X|O)(.{'.$e.'}\1){4}/',$b)-1?:die("P1 Wins");strstr($b,'.')?'':die("P2 Wins");}

그리고 다음 코드는 골프화되지 않은 버전입니다.

<?php
error_reporting(E_ALL & ~E_NOTICE);

for(;$i++<6;)$b.='......|';
while(($a=trim(fgets(STDIN)))!='q'){

    #Validate and assign 
    preg_match('/^([0-5]) ([0-5]) ([XO])$/',$a,$d)&($b[$c=$d[2]*7+$d[1]]=='.')?$b[$c]=$d[3]:print"INVALID\n";

    #Output
    echo str_replace("|","\n",$b); 

    #Check if Order wins
    foreach([0,5,6,7]as$e) {
        preg_match('/(X|O)(.{'.$e.'}\1){4}/',$b)-1?:die("P1 Wins");
    }

    #Check if Chaos wins
    strstr($b,'.')?'':die("P2 Wins");
}

예, 통지는 괜찮습니다.
ASCIIThenANSI

4

자바 스크립트, 360

MSIE에서도 실행되는 수정 된 대화식 게임 편집

요청에 따라 텍스트 기반 게임, 팝업을 통한 입력, 콘솔에서 출력 (단일 간격 글꼴 포함).

'q'또는 프롬프트에서 'cancel'을 클릭하여 게임을 종료하십시오.

ES5 기능을 사용하지 않으면 모든 모더 브라우저 (JS 콘솔 패널이있는 곳)에서 실행되어야합니다.

b='\n......'.repeat(6).split('');
for(h=t=0;!h&t<36;)
{
  i=prompt();
  if(i=='q')i=null;
  i=i.match(/([0-5]) ([0-5]) ([XO])/);
  m='INVALID';
  if(b[p=i?i[2]*7-~i[1]:0]=='.')
  {
    ++t;
    b[p]=i[3];
    m=b.join('');
    for(x=z='',c=0;c++<6;)
      for(x+='_',z+='_',r=0;r<6;r++)
        x+=b[c+r*7],z+=b[c<4?c-1+r*8:c+1+r*6];
    h=(/X{5}|O{5}/.test(b.join('')+x+z))
  }
  console.log(m);
}
console.log("P"+(2-h)+" WINS")

이제 좀 더 재미있는 인터랙티브 및 그래픽 버전을 사용하여 스 니펫을 실행하십시오.


클릭 가능한 멋진 버전! (사소한 제안 : 라디오 버튼 대신 오른쪽 / 왼쪽 클릭을 사용할 수 있습니다.)
xebtl

@xebtl 시도해
볼게요

1

자바, 565 자 D :

public class M{public static void main(String[]r){int[]p=new int[36];int u=0;for(;;){String l=new java.util.Scanner(System.in).nextLine();if(l == "q")break;int a=l.charAt(0)-'0'+(l.charAt(2)-'0')*6,i=p[a]==0?1:0;if(i>0)p[a]=l.charAt(4);u+=i;r(i==0?"INVALID\n":"");if(u==36){r("P2 WINS");break;}for(int x=0;x<6;x++)for(int y=0;y<6;y++)for(int d=0;d<3;d++)try{int e=1,c=p[x+y*6],z=x,h=y;if(c=='X'||c=='Y'){for(;e<6;e++){if(d%2==0)z++;if(d>0)h++;if(p[z+h*6]!=c)break;}if(e==5){r("P1 WINS");return;}}}catch(Exception e){}}}static void r(Object o){System.out.print(o);}}

이것은 아마도 가장 긴 코드 골프 일 것입니다. 나는 이것에 정말로 좋지 않다.


1

옥타브, 453

format plus 'XO.'
disp(F=zeros(6))
r=@()fread(0,1);R=@()r()-47;q=@(m)printf(m)&&quit;e=@()q("INVALID");l=@(n)n<1||n>6&&e();s=@()r()==32||e();w="P1 WINS";f=@(v)abs(sum(v))==22.5&&q(w);g=@(m)any(abs(sum(m))==22.5)&&q(w);d=@diag;while 1
i=R();i==66&&quit;l(i);s();l(j=R());s();F(j,i)&&e();abs(v=R()-36.5)==4.5||e();F(j,i)=v;disp(F)
r();f(d(F,-1));f(d(F,0)(2:6));f(d(F,0)(1:5));f(d(F,1));g(F(1:5,:));g(F(2:6,:));g(F(:,1:5)');g(F(:,2:6)');F&&q("P2 WINS");end

구현은 매우 간단하며 format plus인쇄를 처리하는 데 사용할 수 있는 유일한 "트릭" 입니다. 다음은 주석 처리 된 버전입니다.

format plus 'XO.'               # this is where the magic happens

## initialize and print empty board
disp(F=zeros(6))

## shortcuts
r=@()fread(0,1);
R=@()r()-47;
q=@(m)printf(m)&&quit;
e=@()q("INVALID");
l=@(n)n<1||n>6&&e();
s=@()r()==32||e();
w="P1 WINS";
f=@(v)abs(sum(v))==22.5&&q(w);
g=@(m)any(abs(sum(m))==22.5)&&q(w);
d=@diag;

while 1
  i=R();                        # read index 1
  i==66&&quit;                  # ‘q’?
  l(i);                         # check bounds
  s();                          # read and check space
  l(j=R());                     # read and check index 2
  s();                          # read and check space
  F(j,i)&&e();                  # square already filled?
  abs(v=R()-36.5)==4.5||e();    # valid mark?
  F(j,i)=v;                     # assigndisp(F)                       # and print board
  r();                          # read off newline

  ## check diagonals
  f(d(F,-1));
  f(d(F,0)(2:6));
  f(d(F,0)(1:5));
  f(d(F,1));

  ## check rows
  g(F(1:5,:));
  g(F(2:6,:));

  ## check columns
  g(F(:,1:5)');
  g(F(:,2:6)');

  ## check chaos
  F&&q("P2 WINS");
end

입력 구문과 유효성을 확인해야하기 때문에 코드는 fread()한 번에 한 문자 씩 읽는 데 사용 됩니다.

나는 보드와 메시지를 깔끔하게 출력하도록주의를 기울였다. 추가 출력이 허용되는 경우 몇 바이트를 줄일 수 있습니다. 예를 들어, 자동 인쇄 (no disp(F))를 사용하면 보드는 다음과 같이 표시됩니다.

F =

......
......
......
......
......
......

또한 각 움직임은 별도의 줄에 있다고 해석했습니다.


샘플 상호 작용 ( -q 스위치는 Octave의 헤더를 억제하기위한 것입니다) :

$ octave -q order_chaos.m 
......
......
......
......
......
......
3 3 X
......
......
......
...X..
......
......
2 3 O
......
......
......
..OX..
......
......
3 3 O
INVALID

잘못된 이동으로 인해 프로그램이 종료되었습니다 (의도 한 것인지 확실하지 않음).


(혼란이 있었기 때문에) 확실하게하기 위해, 주어진 보드가 승리하는지 확인하는 대신 두 플레이어의 입력을 받아 실제로 게임을 시뮬레이트합니까?
ASCIIThenANSI

@ASCIIThenANSI 그냥. 양식의 각 이동은 x y t별도의 줄에서 수행되며 다른 입력은 필요하지 않습니다.
xebtl

그리고 모든 입력 후에 보드를 인쇄합니까?
ASCIIThenANSI

@ASCIIThenANSI 예, 수정 된 답변을 참조하십시오.
xebtl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.