【问题标题】:How to analyze a mastermind-like game using logical inferences如何使用逻辑推理分析类似策划者的游戏
【发布时间】:2012-01-30 17:46:05
【问题描述】:

免责声明:我不是在寻找 Mastermind 的解决方案。


我正在尝试编写一个程序来解决像 mastermind 这样的游戏,但我有点卡住了。我不想要一个完整的解决方案,只帮助我无法通过的部分。这是游戏:

N 预先知道的可能颜色。有一组未知的k 被选中并保密。目标是猜测秘密集中的颜色(重复)。让我再次强调这是一个集合,所以顺序无关紧要,但允许重复。例如

颜色为a,b,c,d,e,f,g,h (N=8),未知集为{a,c,c} (k=3)。

进行连续猜测,从而获得有关秘密集的更多信息。每个猜测必须是一组(允许重复)k 颜色。对每个猜测的响应是猜测和未知集计数重复之间的共同颜色数。例如

  1. 猜测:a,d,e 结果:1

  2. 猜测:b,c,f 结果:1

  3. 猜测:a,a,g 结果:1

  4. 猜测:a,c,h 结果:2

  5. 猜测:b,e,h 结果:0

猜测是别人做出的。我的目标是:

- 确定何时知道有关特定颜色的信息。

- 确定何时可以逻辑推导出未知集合。

在游戏开始时,没有颜色绝对在集合中或绝对不在未知集合中(假设N>1)。在得到0 的猜测之后,已知该猜测的所有颜色都不在未知集中。如果结果是k,则该猜测的所有颜色都已知在未知集中。我无法编写一个程序来找出介于两者之间的所有情况。例如,在上述最后一次猜测之前,对于任何颜色都没有任何确定的信息。在最后一次猜测之后,已知该集合为a,c,c。逻辑是这样的:

  • 到 5 时,b,e,h 不在未知集合中
  • 到 4 时,a,c 在未知集合中
  • 1,d 不在未知集合中
  • 到 2,f 不在未知集合中
  • 到 3,g 不在未知集合中
  • 因此,未知集中的唯一颜色是 ac
  • 到 3 时,a 不止一次出现在未知集中。
  • 因此未知集是a,c,c

我可以通过这种方式处理逻辑,但我不确定一般如何编程。如果有人可以建议一种结构化的方式来解决它,那就太好了。 我更喜欢使用伪代码的高级解释,而不是任何一种语言的完整实现。谢谢。

【问题讨论】:

  • "interviewee":(嗯)你为什么需要这个,你需要多快得到答案?
  • 仅供参考,您正在寻找的术语(“具有重复但无序的集合”)通常称为 multiset 或袋子。
  • @RBarryYoung 我需要它,因为我正在尝试编写以学习如何在代码中实现逻辑,而这是分配给我的项目。这不是家庭作业。我并不迫切需要它,但继续进步会很好。我自己花了几天的时间,但我没有找到办法。
  • 你选择的名字是这个问题的根源。原则上,我通常会等待一段时间,然后再帮助某人解决看似面试的问题。
  • @RBarryYoung 这是我第一次注册stackoverflow时选择的用户名。

标签: algorithm set logic


【解决方案1】:

直截了当的方法:构建可能组合的总数。然后,随着猜测的出现,删除不可能满足当前猜测结果的组合。一旦你只剩下一个组合,那就是解决方案。或者,在此过程的早期,当您不再具有特定颜色时,那么(显然)该颜色会从可能的密码中消除。

【讨论】:

  • 这种方法有两个问题: 1. 我不知道如何根据组合的猜测/结果信息消除可能的集合。 2. 因为N 可能很大,所以我不能轻易列举所有的可能性。
  • 但是 +1 是因为我是第一个回答我提出的问题而不是我明确没有提出的问题的人 :-)
  • 哦!我知道了。我可以将猜测与可能的组合进行比较,看看它们是否给出相同的结果。所以我想我实现这一点的唯一问题是第 2 点 - 枚举的可能性太多。不过,这是一个有用的建议。谢谢!
【解决方案2】:

您可以在每次猜测后对逻辑进行编码,如下所示。取一个长度为N 的数组,如果ith 颜色在集合中,则位置i 的条目为+1,如果ith 颜色不在集合中,则-1 和@ 987654327@ 如果不知道ith 颜色是否在集合中。

每次猜测后,您都会创建满足结果的可能数组。如果猜测结果为r,那么将有(k choose r)(如果有重复的颜色则更少)可能的数组。对于您的示例,数组是(这里我使用 + 而不是 +1- 而不是 -1 为简洁起见)

  1. (+,0,0,-,-,0,0,0) | (-,0,0,+,-,0,0,0) | (-,0,0,-,+,0,0,0)
  2. (0,+,-,0,0,-,0,0) | (0,-,+,0,0,-,0,0) | (0,-,-,0,0,+,0,0)
  3. (+,0,0,0,0,0,-,0) | (-,0,0,0,0,0,+,0)
  4. (+,0,+,0,0,0,0,-) | (+,0,-,0,0,0,0,+) | (-,0,+,0,0,0,0,+)
  5. (0,-,0,0,-,0,0,-)

现在,您可以在收到信息时检查可能性之间的一致性。第一次猜测后有 3 种可能性,每种可能性均相同。在第二次猜测之后,有 9 种可能性(前 3 种中的 1 种和后 3 种中的 1 种)并且每种都是有效的。第三次猜测后,有​​ 18 种可能性,其中只有 9 种是有效的。这是因为 3 中的左选项需要 1 中的左选项,反之亦然。在第四次猜测之后,有 5 种有效的可能性。第五次猜测后,只有1个有效的可能性,即:

  1. (+,0,0,-,-,0,0,0)
  2. (0,-,+,0,0,-,0,0)
  3. (+,0,0,0,0,0,-,0)
  4. (+,0,+,0,0,0,0,-)
  5. (0,-,0,0,-,0,0,-)

现在每种颜色的包含/排除都是已知的。您可以用类似的方式处理多重性。

【讨论】:

    【解决方案3】:

    Knuth described 一个解决方案。我implemented它。

    【讨论】:

    • 这是一个猜测的解决方案。这并不能解决我提出的问题。另外,我不关心职位。
    • 致 OP:阅读 Knuth 的文章,你就会知道如何猜测。
    • @wildplasser 我不是在寻找如何猜测的算法请阅读我的问题。 我不是在猜测。我只是在分析与颜色相关的信息。
    • 好吧,决策树或二元决策树 (oBDD) 似乎很合适。也许在位掩码的帮助下生成它们。如果你还有一个未解决的游戏(你似乎有),下一个决定仍然是接下来要尝试什么(:=将导致你需要的信息)
    • @wildplasser 您仍然错过了这个问题。 我没有做任何决定。我只是想确定哪些颜色被强制在未知集中,哪些颜色被强制不在未知集中。
    【解决方案4】:

    所选项目:ade=1 => 3 种可能 100、010、001

    此行未知:bcfgh=? => 5 项 = 32 种可能

    将这些组合起来给出 32*3=96 个可能的答案

    重复下一行并删除所有行不可能的行

    只剩下一个可能

    【讨论】:

    • 感谢您试图提供帮助,但我不明白您写到这里。您能否为这应该是什么意思/做什么添加一些解释?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多