这是我前几天想到的一个有趣的问题,它涉及到一些代码位与其他代码位竞争,不仅是在代码具有的属性中,而且是通过与其他代码位进行游戏。
您的任务是构建一个程序,该程序采用Go板的当前状态,并确定要采取或通过的动作。
您的程序将接受以下内容作为输入:
19行,每行19个字符,代表Go板上当前的棋子。的字符
0
代表一个空的正方形,1
是黑色和2
白色。两个数字代表每个玩家拥有的囚犯件数(黑色,然后是白色)。
一个数字,代表要移动的人(黑色或白色)。如上所述,
1
是黑色,2
是白色。
并输出以下内容之一:
一对坐标,
a b
表示移动的坐标。1 1
是左上角的正方形,第一个和第二个数字分别代表向下和向右移动。字符串
pass
,表示通过。
例如,该程序可能会收到以下输入:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000000000000000000
0001210000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
0 0 1
代表只玩了几步的游戏。
然后程序可能会输出6 5
,这意味着“在顶部的第6点和左侧的第5点放置一块黑色的石头”。这将捕获处的白色石头7 5
。董事会的状态将更改为:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000100000000000000
0001010000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
1 0 2
(请注意,尽管捕获了一块白色的石头,但仍算是黑色的囚徒。)
您的代码还必须满足以下属性:
如果您的程序被赋予相同的输入状态,则它必须始终产生相同的输出。这就是Go AI的确定性。它不能包含随机成分。
您的程序最多只能花费60秒来确定要采取的措施。由于计算能力的变化,将不会严格应用此规则,但必须在合理的时间内采取行动。
程序的源代码不得超过1兆字节(1,048,576字节)。
您的程序必须始终采取法律行动。您的程序无法在已经存在宝石的地方移动,也不能放置会导致捕获其自己的宝石的工件。(针对此挑战的规则的一个例外是,允许程序创建最初存在的位置-因为仅给出了董事会的当前位置,所以不能指望存储已经做出的动作之前。)
然后,您提交的内容将与所有其他提交的内容一起参加一场无所不能的锦标赛,在围棋游戏中,棋盘的状态开始为空,每个程序轮流进入棋盘的位置并进行移动。
每对参赛作品将进行两轮比赛-每位选手均为黑人时进行一轮比赛。因为此问题中的AI完全是确定性的,所以两个相同的AI一起玩总是会导致玩完全相同的游戏。
获胜条件如下:
如果您的程序播放到比赛结束,那么Go的中文得分规则将用于确定获胜者。不会应用komi。
如果您的程序播放到达到较早状态的状态,从而导致无限循环,则这两个程序将被声明绑定。
您的提交将根据其相对于其他提交的得分得分。一场胜利值得一分,而平局则值得一分。得分最高的作品是总冠军。
这是一项艰巨的挑战,任何人都可以随时发布新条目,并且在出现这种情况时会定期重新评估排名。