秩序与混沌是在6x6板上玩的Tic-Tac-脚趾的变体。然而,这款游戏的独特之处在于,双方都可以放置X或O!每个回合(从顺序开始),玩家将X或O放置在任何未被占用的方块中。
胜利很简单。如果棋盘上有5个X或O(垂直、水平或对角线),则Order获胜。混乱获胜,如果董事会是填补和没有字符串的5 x或O在董事会上。你的工作?嗯,因为这是编程难题和代码高尔夫,你要编程的游戏,和高尔夫。
x y t
,其中x
和y
是坐标,t
是平铺类型(X
或O
)。坐标从左上角的0 0
开始,然后增加到5 5
(右下角)。q
退出,如果用户输入无效的坐标、tiles、任何非x y t
形式的输入,或尝试将瓷砖放置在已经存在的位置,则必须打印INVALID
。(唯一的例外是q
,因为它退出了程序。)P1 WINS
。如果混沌占上风,您将输出P2 WINS
。.
表示。X
和O
(大写)。您不必接受小写,但需要大写。.XO
组成。起始板如下所示:
......
......
......
......
......
......
在第一个player (订单)输入1 2 X
之后,它应该如下所示:
......
......
.X....
......
......
......
同样,当下一个参与者(混沌)输入3 3 O
时,它将如下所示:
......
......
.X....
...O..
......
......
这种情况一直持续到一位玩家获胜。
和往常一样,标准的漏洞,把乐趣从每一件事中拿走是被禁止的。
获胜者是在世界协调时间6月15日(大约一个月后,这一挑战被发布),代码最短的人。
发布于 2015-05-15 22:43:21
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; # 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)
),板将显示为
F =
......
......
......
......
......
......
此外,我解释说,每一个移动是在一个单独的行。
示例交互( -q
开关只是为了抑制Octave的标题):
$ octave -q order_chaos.m
......
......
......
......
......
......
3 3 X
......
......
......
...X..
......
......
2 3 O
......
......
......
..OX..
......
......
3 3 O
INVALID
无效的移动导致程序退出(不确定这是否有意)。
发布于 2015-05-16 09:17:37
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);}}
这可能是有史以来最长的密码-高尔夫。我真的不擅长这个。
https://codegolf.stackexchange.com/questions/50236
复制相似问题