秩序与混沌与密码高尔夫


10

Order and Chaos是在6x6板上播放的Tic-Tac-Toe的变体。然而,使游戏与众不同的是,两个玩家都可以放置X或O!每回合(从订购开始),玩家将在任何未占用的方块中放置X或O。
获胜很简单。如果板上连续有5个X或O(垂直,水平或对角线),则订单获胜。如果棋盘已满,并且棋盘上没有5个X或O的字符串,则混沌获胜。你的工作?好吧,由于这是《Programming Puzzles》和《 Code Golf》,因此您将对游戏进行编程,然后进行高尔夫。

规则

  • 您必须接受输入为x y t,其中xy是坐标,并且t是图块类型(XO)。坐标从0 0左上角开始,一直增加到5 5(右下角)。
  • 您必须接受q退出,并INVALID在用户输入无效的坐标,磁贴,任何非形式的输入时进行打印x y t,或尝试将磁贴放置在已经存在的位置。(唯一的例外是q,因为这会退出程序。)
  • 如果Order获胜,您将输出P1 WINS。如果混沌获胜,您将输出P2 WINS
  • 必须先下订单。
  • 空格由表示.
  • 磁贴为XO(大写)。您不必接受小写字母,但必须使用大写字母。
  • 您的董事会只能由组成.XO
  • 您实际上是在模拟两个玩家在玩游戏,而不是获得董事会和检查谁获胜。它接受一个动作作为输入,然后打印棋盘,接受另一个动作,依此类推,直到一个玩家获胜。

起始板如下所示:

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

在第一个玩家(订购)输入之后1 2 X,它应该如下所示:

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

同样,当下一个玩家(混沌)输入时3 3 O,它将如下所示:

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

直到一位玩家获胜为止。

与往常一样,禁止从所有内容获取乐趣的标准漏洞

优胜者的代码最短的时间是UTC时间6月15日00:00(距发布此挑战大约一个月)。


如果玩家输入已经担任的职位怎么办?
Loovjo 2015年

@Loovjo它返回INVALID。谢谢,我现在已经对其进行了编辑。
ASCIIThenANSI,2015年

1
一旦检测到连续5个磁贴,游戏是否应该退出?
凯尔·卡诺斯

1
也许我忽略了它,但是它是否必须将棋盘打印到屏幕上或者只是检查棋盘的状态并输出哪个玩家获胜?
科多斯·约翰逊

@Andrew我实际上是想模拟游戏。您接受每个玩家的输入,一次一回合,然后检查一个玩家是否赢得了每一回合。描述不清楚吗?
ASCIIThenANSI

Answers:


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 2015年

4

JavaScript,360

编辑修改后的互动游戏,即使在MSIE中也应运行

根据要求,基于文本的游戏,通过弹出窗口输入,在控制台中输出(以便具有等宽字体)。

使用“ q”退出游戏或在提示符下单击“取消”。

不使用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 2015年

@xebtl我会尝试一下
edc65

1

Java,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()只能读取一个字符。

我注意以整洁的方式输出公告板和消息。如果可以接受一些额外的输出,我可以节省几个字节。例如,使用自动打印(否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 2015年

并在每次输入后打印电路板?
ASCIIThenANSI

@ASCIIThenANSI是,请参见编辑答案。
xebtl 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.