您的目标是为Wythoff的Nim游戏编写一个完美的玩家。
威索夫的尼姆规则
Wythoff的Nim是确定性的两人游戏,有两堆相同的计数器。玩家轮流进行以下操作之一:
- 从第一堆中删除一个或多个计数器
- 从第二堆中删除一个或多个计数器
- 从第一堆和第二堆中删除相同数量的计数器(一个或多个)。
当然,筹码不能为负,但可以为0。无论哪个玩家移除最后一个计数器,整体都会获胜。
对于更注重几何的人,这里是您可以在此applet上玩的等效游戏。单个女王从四分之一无限棋盘的某个正方形开始,该正方形的角在左下角。玩家交替移动皇后,其移动方式类似于国际象棋皇后,但仅限于三个方向:
- 下
- 剩下
- 斜向左下
将女王移到角落的人都将获胜。
将女王的坐标(带有角(0,0)
)与各个桩的大小相关联,很容易看出两个游戏是相同的。
完美发挥
(如果您熟悉完美比赛和获胜手法的概念,则可以跳过此步骤。)
由于Wythoff的Nim是一种有限的确定性游戏,因此它具有完美玩法的概念。完美的玩家是一种始终会从理论上获胜的位置获胜的策略,这意味着存在一种能够确保获胜的策略的位置。
作为获胜策略,只要将刚移动的玩家始终移动到理论获胜位置即可,因此该玩家不会继续前进。这些获胜职位中的第一个(也称为冷职位)是(0,0), (1,2), (2,1), (3,5), (5,3)
。有关为Wythoff的Nim寻找获胜策略的算法的解释以及生成获胜位置的公式,请参阅Wikipedia文章。
计划要求
编写程序或函数时,将一个位置作为输入,并以该位置之后的位置形式输出获胜的位置。最少的字节数获胜。
如果不存在获胜举动,即该头寸是理论上的亏损,则您的程序应表明是这样,否则将被没收。
您的程序必须在合理的时间内运行。因此,指数递归游戏树搜索将无法满足要求。如果您想对策略进行预计算和硬编码,那很好。
输入值
一对(i,j)
非负数,代表堆大小,每个最多为99
。它可以是两个数字,一个元组,一个列表或您喜欢的任何容器。
输出量
移动后打印或输出位置,再次以两个数字或一个容器的形式输出。这必须是合法转移到获胜职位。如果有多个这样的举动,那么任何一个都可以,但是只有一个。
如果没有获胜的举动,则必须在输出中指出。只要不是合法位置,并且对于每一个丢失的输入都是相同的,则任何输出False
(None
,,0或)(-1,-1)
都可以。
运行示例
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)