Perverse Hangman是一款非常像常规Hangman的游戏,有一个重要区别:获胜的单词由房子动态决定,具体取决于猜测的字母。
例如,假设您有董事会 _ A I L 以及其他12个猜测。因为有13个不同的单词以AIL结尾(保释,失败,冰雹,监狱,kail,邮件,钉子,桶,铁路,帆,尾巴,ail,w),所以无论你猜不到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
答案 0 :(得分:6)
这几乎与“如何通过重复称重找到奇怪的硬币?”相同。问题。根本的见解是,您正在尝试最大化您从猜测中获得的信息量。
构建决策树的贪婪算法如下: - 对于每个猜测,选择答案为“真”的猜测和答案为“假”的猜测尽可能接近50-50,因为从理论上讲,这给出了最多的信息。
设N是集合的大小,A是字母表的大小,L是单词中的字母数。
所以把你所有的话放在一个集合中。对于每个字母位置,以及字母表中的每个字母,计算该字母在该位置有多少个单词(这可以使用额外的散列表进行优化)。选择最接近大小的一半的计数。这是O(L * A)。
将该集合分为两个,将具有此字母的子集置于此位置,并使两个分支到树中。重复每个子集,直到您拥有整个树。在最坏的情况下,这将需要O(N)步骤,但如果你有一个很好的字典,这将导致O(logN)步骤。
答案 1 :(得分:0)
这不是一个严格的答案,因为它没有给你一个决策树,但在写hangman solver时我做了一些非常相似的事情。基本上,它会查看字典中与模式匹配的单词集,并选择最常用的字母。如果猜错了,就会消除最多的候选人。由于在刽子手中猜对没有惩罚,我认为这是给定约束的最佳策略。
因此,根据您提供的字典,它会首先正确地猜测a
。然后它会猜测r
,也正确,然后是b
(不正确),然后是c
。
不正当的刽子手的问题在于,如果你猜错了,你总是猜错了,但这对于这个算法是完美的,因为它首先消除了最大的集合。作为一个更有意义的例子:
字典:
mar
bar
car
fir
wit
在这种情况下,它首先错误地猜测r
并且只留下机智。如果wit
在字典中被sir
替换,那么它会正确猜测r
,然后a
错误地猜测,消除较大的集合,然后w
或{{ 1}}随机错误,其次是最后一个单词只有1个不正确的猜测。
因此,如果有可能获胜,这个算法将获胜,不过你必须实际运行才能看到它是否胜利。