Python 石头尼姆游戏解读

Python 石头尼姆游戏解读,python,bit-manipulation,combinatorics,game-theory,Python,Bit Manipulation,Combinatorics,Game Theory,我当时正在做一个编码问题,不知怎么的,我通过了所有的测试用例,但我不知道到底发生了什么。问题是经典nim游戏的一个小转折: 有两个玩家A和B。有N堆不同的石头。如果堆数小于K,每个玩家可以拿走任意数量的石头,否则他们必须拿走K的倍数。最后一个拿石头的人获胜 蟒蛇 # solution -> will A win the game of piles, k? def solution(piles, k): gn = 0 # Grundy number for pile in p

我当时正在做一个编码问题,不知怎么的,我通过了所有的测试用例,但我不知道到底发生了什么。问题是经典nim游戏的一个小转折:

有两个玩家A和B。有N堆不同的石头。如果堆数小于K,每个玩家可以拿走任意数量的石头,否则他们必须拿走K的倍数。最后一个拿石头的人获胜

蟒蛇

# solution -> will A win the game of piles, k?
def solution(piles, k):
    gn = 0 # Grundy number
    for pile in piles:
        if pile % 2 != 0:
            gn ^= pile + 1
        else:
            gn ^= pile - 1
    return gn != 0

我不确定是否有足够的测试用例,但这里甚至没有使用k。老实说,我很难理解gn Grundy数字的真正含义。我意识到,如果所有堆的xor不是零,就有一个赢得Nim游戏的证据,但我真的不明白为什么这种变化需要检查堆的奇偶性。

首先,给定的解决方案是不正确的。您注意到它没有使用k,实际上这是一个很大的红旗。你也可以看看它给单桩游戏带来的结果,它似乎说玩家a只有在桩的大小是你应该很快能够显示的不正确的情况下才会赢

不过,答案的结构有点正确。格伦迪数的许多威力在于,在单个博弈状态的格伦迪数的有限序数的情况下,组合博弈状态的格伦迪数是nim和XOR。这只适用于组合游戏状态的一种非常特定的方式,但事实证明,这是将Nim堆考虑在一起的自然方式。因此,这个问题确实可以通过找到考虑k和XOR的每一堆的Grundy数来解决,将它们放在一起得到完整游戏状态的Grundy数。在Nim中,你可以从一堆石头中取出任意数量的石头,并通过取出最后一块石头而获胜,而一堆石头的格兰迪数正好是一堆石头的大小。这就是为什么Nim版本的解决方案只是XOR-s堆的大小

因此,把这个理论视为理所当然,你可以通过为给定k的单桩找到正确的格伦迪值来解决这个问题。你只需要考虑一堆游戏就能做到这一点。这实际上是一个非常经典的问题,与多桩Nim相比,IMO更易于正确分析。你应该试一试

至于如何看待格伦迪数字,有很多地方可以阅读,但我的方法是这样的。要理解的是,为什么两个游戏状态的组合允许前一个玩家B在格伦迪数相等的情况下获胜

这样做,我们只需要考虑移动对两个状态的Gruny数的影响。

根据定义,作为继承国的最小排除值,总是有一个移动将一个州的格兰迪数更改为任何较低的值,即n可以变成从0到n-1的任何数字。从来没有一个动作能让格伦迪的数字保持不变。可能有也可能没有增加格伦迪数的动作

然后,在两个具有相同格伦迪数的州组合的情况下,玩家B可以通过模仿策略获胜。如果玩家A的移动减少了一个州的格伦迪数,玩家B可以通过将另一个州的格伦迪数减少到相同的值来进行复制。如果玩家A的移动增加了一个状态的格伦迪数,那么玩家B可以通过在相同的状态上移动来撤销它,从而将其减少到与之前相同的值。我们的游戏是有限的,所以我们不必担心做和做的无限循环。这些是一个孩子唯一能做的事情。请记住,重要的是,没有任何一个动作可以让格伦迪数字保持不变

如果各州没有相同的格伦迪号码,那么第一个玩家获胜的道路是明确的;它们只是减少具有较高值的状态的数量,以匹配具有较低值的状态。这将把事情简化为前面的场景

这里我们应该注意到,最小排除值定义允许我们根据任何状态的后继者递归地构造任意状态的格伦迪数,至少对于有限博弈是这样。没有选择,所以这些数字实际上是定义明确的

下一个要解决的问题是为什么我们可以计算一个组合状态的格兰迪数。我不想在这里考虑XOR。我们可以纯粹从最小排除值属性定义这个nim求和操作。我们抽象地考虑了nimuSunx,y的继承者是{nimulSunk,y,k为0…x-1 },{nimuSunx,k为0…y-1 }中的k;换句话说,在一个子状态或另一个子状态上移动。我们可以忽略增加格伦迪数的一个子州的继任者,因为这样一个州将拥有原始州的所有继任者加上尼姆苏姆,y本身作为另一个继任者,因此它必须拥有严格更大的格伦迪数。是的,这有点像手的波浪。这和XOR是一样的。对此我没有特别好的解释,但我觉得没有必要做一个基本的解释
理解力重要的是,它是一个定义良好的操作。

如果您在浏览器中搜索尼姆·格伦迪号码,您会找到比我们在这里所能处理的更好的解释这一点的参考资料。@Prune当然可以。不过,我还是想理解为什么k不会影响解决方案。我主要编辑了这个问题,以便删除我的反对票。我的直觉是,给定的解决方案不足以完全满足您所引用的理由。当所有桩的石头少于k时,游戏将减少为常规Nim,但之前的情况应考虑k。我得和我的格伦迪·康威主管商量一下。。。