【问题标题】:The perverse hangman problem反常刽子手问题
【发布时间】:2009-12-07 10:49:10
【问题描述】:

Perverse Hangman 是一款与普通 Hangman 非常相似的游戏,但有一个重要区别:获胜的单词由房子根据猜到的字母动态确定。

例如,假设您有棋盘 _ A I L 和 12 个剩余的猜测。因为有 13 个以 AIL 结尾的不同单词(bail、fail、hail、jail、kail、mail、nail、pail、rail、sail、tail、vail、wail),所以无论您猜到什么 12 个字母,房子都一定会赢,房子会声称你选择的词是你没有猜到的。但是,如果董事会是_ I L M,那么您已经走投无路了,因为 FILM 是唯一以 ILM 结尾的单词。

挑战是:给定字典、字长和允许猜测的数量,提出一个算法:

a) 证明玩家总是会赢

b) 通过为房子输出一个决策树来证明房子总是赢,该决策树允许房子无论如何都能逃脱。

作为一个玩具示例,考虑字典:

bat
bar
car

如果允许您猜错 3 次,则玩家将通过以下树获胜:

Guess B
NO -> Guess C, Guess A, Guess R, WIN
YES-> Guess T
      NO -> Guess A, Guess R, WIN
      YES-> Guess A, WIN

【问题讨论】:

  • 抱歉...您有什么问题?
  • 您错过了从老师那里编写问题规范的附加部分“......或者,向更有学识的同事提出挑战;接受他们的答案,并声称它是您自己的。”
  • 也许如果你把它标记为 code-golf 并将其设为 CW,你的问题可能会有机会......
  • 这当然是一个真实的问题,算法(评估游戏树)是程序员感兴趣的标准之一。这个问题唯一的问题是它是家庭作业(提问者没有完成他们的工作)。
  • 我已经投票反对,并且已经回答了这个问题。说不是一个真正的问题与“我认为你不应该帮助这个孩子做作业”是不一样的。让其他人选择

标签: algorithm


【解决方案1】:

这几乎与“如何通过重复称重找到奇数硬币?”问题。基本的洞察力是,您试图最大限度地提高您从猜测中获得的信息量。

构建决策树的贪心算法如下: - 对于每个猜测,选择答案为“真”和答案为“假”的猜测尽可能接近 50-50,因为理论上这提供了最多的信息。

令 N 为集合的大小,A 为字母表的大小,L 为单词中的字母数。

所以把你所有的词放在一个集合中。对于每个字母位置,以及字母表中的每个字母,计算该位置有多少个单词(这可以通过额外的哈希表进行优化)。选择大小最接近集合一半的计数。这是 O(L*A)。

将集合一分为二,取在这个位置有这个字母的子集,并把这两个分支变成树。对每个子集重复,直到拥有整棵树。在最坏的情况下,这将需要 O(N) 步,但如果你有一本不错的字典,这将导致 O(logN) 步。

【讨论】:

    【解决方案2】:

    这不是一个严格的答案,因为它没有给你一个决策树,但我在写我的hangman solver 时做了一些非常相似的事情。基本上,它会查看字典中与模式匹配的单词集并选择最常见的字母。如果它猜错了,它会淘汰最多的候选人。由于在刽子手中猜对没有任何惩罚,我认为这是给定约束条件下的最佳策略。

    因此,使用您提供的字典,它首先会正确猜出a。然后它会猜测r,同样正确,然后是b(不正确),然后是c

    反常刽子手的问题是,如果你猜错了,你总是会猜错,但这对于这个算法来说是完美的,因为它首先消除了最大的集合。作为一个更有意义的例子:

    字典:

    mar
    bar
    car
    fir
    wit
    

    在这种情况下,它首先会错误地猜测r,然后只剩下机智了。如果wit在字典中被替换为sir,那么它会正确猜测r然后错误猜测a,消除较大的集合,然后随机错误地排除wf,然后是另一个为最后一个词,只有 1 次猜错。

    因此,如果有可能获胜,则此算法将获胜,尽管您必须实际运行它才能查看它是否获胜。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2014-09-10
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多