首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >秩序与混沌与柯德道夫

秩序与混沌与柯德道夫
EN

Code Golf用户
提问于 2015-05-15 19:00:39
回答 2查看 447关注 0票数 10

秩序与混沌是在6x6板上玩的Tic-Tac-脚趾的变体。然而,这款游戏的独特之处在于,双方都可以放置X或O!每个回合(从顺序开始),玩家将X或O放置在任何未被占用的方块中。

胜利很简单。如果棋盘上有5个X或O(垂直、水平或对角线),则Order获胜。混乱获胜,如果董事会是填补和没有字符串的5 x或O在董事会上。你的工作?嗯,因为这是编程难题和代码高尔夫,你要编程的游戏,和高尔夫。

The Rules

  • 您必须接受输入为x y t,其中xy是坐标,t是平铺类型(XO)。坐标从左上角的0 0开始,然后增加到5 5 (右下角)。
  • 您必须接受q退出,如果用户输入无效的坐标、tiles、任何非x y t形式的输入,或尝试将瓷砖放置在已经存在的位置,则必须打印INVALID。(唯一的例外是q,因为它退出了程序。)
  • 如果订单获胜,您将输出P1 WINS。如果混沌占上风,您将输出P2 WINS
  • 秩序必须先行。
  • 空白由.表示。
  • Tiles是XO (大写)。您不必接受小写,但需要大写。
  • 您的董事会必须只由.XO组成。
  • 你实际上是在模拟两个玩家玩游戏,而不是给他们一个棋盘和检查谁赢了。它接受一个移动作为输入,然后打印板,接受另一个移动,以此类推,直到一个玩家获胜。

起始板如下所示:

代码语言:javascript
运行
复制
......
...... 
......
......
......
...... 

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

代码语言:javascript
运行
复制
......
...... 
.X....
......
......
......  

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

代码语言:javascript
运行
复制
......
...... 
.X....
...O..
......
......  

这种情况一直持续到一位玩家获胜。

和往常一样,标准的漏洞,把乐趣从每一件事中拿走是被禁止的。

获胜者是在世界协调时间6月15日(大约一个月后,这一挑战被发布),代码最短的人。

EN

回答 2

Code Golf用户

发布于 2015-05-15 22:43:21

Octave,453

代码语言:javascript
运行
复制
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处理打印的唯一真正的“诀窍”。下面是一个评论版本:

代码语言:javascript
运行
复制
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;                     # assign …
  disp(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)),板将显示为

代码语言:javascript
运行
复制
F =

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

此外,我解释说,每一个移动是在一个单独的行。

示例交互( -q开关只是为了抑制Octave的标题):

代码语言:javascript
运行
复制
$ octave -q order_chaos.m 
......
......
......
......
......
......
3 3 X
......
......
......
...X..
......
......
2 3 O
......
......
......
..OX..
......
......
3 3 O
INVALID

无效的移动导致程序退出(不确定这是否有意)。

票数 1
EN

Code Golf用户

发布于 2015-05-16 09:17:37

Java,565个字符D:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/50236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档