我正在为学校做一个简单的python项目,涉及用户试图在30秒内从9个字母的随机池中找到最长的真实单词。通过循环使用英语中许多单词的文件(它有114,000个单词,可能不包括所有单词),可以很容易地测试用户的答案是否是真实的单词。事实上,这需要一瞬间才能运行。
但是,为了检查随机字母池是否有完整的“解决方案”(9个字母的真实单词),除了测试9个字母的每个单独排列外,我想不出什么单词池对文件中的每个单词。问题是,效率非常低,大约需要7分钟。毕竟,考虑到有9个! anagram的(阶乘)排列,并且“随机”模块不排除先前的排列,并且文件中有许多单词,计算机必须通过超过500亿次比较。最后,没有找到(使用'幸福'的字谜)这个词。这是我试过的代码:
# python 3.5.2
import random
anagram = ['p','s','h','a','i','s','n','p','e'] # anagram of hapiness
with open('wordlist.txt') as in_file:
for line in in_file:
line = line.rstrip()
shuffledList = random.sample(anagram, len(anagram)) # randomise order
shuffledWord = ''.join(shuffledList) # make it a string
if shuffledWord == line:
print("YES") # (never happens)
break
除了实际产生解决方案的代码之外,我正在寻找某种聪明的算法解决方案/线程技术/绝对任何东西,它可以在30秒或更短的时间内找到9个字母的字谜的原始单词。这看起来真的很牵强,但我认为值得一试。有什么建议吗?
答案 0 :(得分:2)
以下是anagrams的小线索:排序后它们是相同的列表。 你可以试试这样的东西:
>>> def is_anagram(word_one, word_two):
... return sorted(word_one) == sorted(word_two)
...
>>> print(is_anagram('ranagam', 'anagram'))
True