【发布时间】:2011-09-14 10:22:00
【问题描述】:
我正在尝试编写一个刽子手算法。我的想法是这样的:
- 预处理包含单词的相对字母频率的字典,具体取决于单词的长度。步骤完成。
例子:
#Each key corresponds to length of the word.
frequencyDict = {2: ['a', 'o', 'e', 'i', 'm', 'h', 'n', 'u', 's', 't', 'y', 'b', 'd', 'l', 'p', 'x', 'f', 'r', 'w', 'g', 'k', 'j'],
3: ['a', 'e', 'o', 'i', 't', 's', 'u', 'p', 'r', 'n', 'd', 'b', 'm', 'g', 'y', 'l', 'h', 'w', 'f', 'c', 'k', 'x', 'v', 'j', 'z', 'q'],
4: ['e', 'a', 's', 'o', 'i', 'l', 'r', 't', 'n', 'u', 'd', 'p', 'm', 'h', 'b', 'c', 'g', 'k', 'y', 'f', 'w', 'v', 'j', 'z', 'x', 'q'],
5: ['s', 'e', 'a', 'o', 'r', 'i', 'l', 't', 'n', 'd', 'u', 'c', 'p', 'y', 'm', 'h', 'g', 'b', 'k', 'f', 'w', 'v', 'z', 'x', 'j', 'q'],
6: ['e', 's', 'a', 'r', 'i', 'o', 'l', 'n', 't', 'd', 'u', 'c', 'p', 'm', 'g', 'h', 'b', 'y', 'f', 'k', 'w', 'v', 'z', 'x', 'j', 'q'],
7: ['e', 's', 'a', 'i', 'r', 'n', 'o', 't', 'l', 'd', 'u', 'c', 'g', 'p', 'm', 'h', 'b', 'y', 'f', 'k', 'w', 'v', 'z', 'x', 'j', 'q'],
8: ['e', 's', 'i', 'a', 'r', 'n', 'o', 't', 'l', 'd', 'c', 'u', 'g', 'p', 'm', 'h', 'b', 'y', 'f', 'k', 'w', 'v', 'z', 'x', 'q', 'j']}
我还有一个字典中的单词生成器:
dictionary = word_reader('C:\\Python27\\dictionary.txt', len(letters))
基于这个函数
#Strips dictionary of words that are too big or too small from the list
def word_reader(filename, L):
L2 = L+2
return (word.strip() for word in open(filename) \
if len(word) < L2 and len(word) > 2)
- 这个特殊的游戏将免费为您提供最后一个元音。例如,如果这个词是土的, 用户将获得以下棋盘:e----e- 进行猜测。所以,我想找到一种方法来创建一个新的生成器或列表 去掉所有不符合 e----e- 模板的词。
p = re.compile('^e\D\D\D\De\D$', re.IGNORECASE) 会这样做,但它可能会找到单词
除了第一个字母和倒数第二个字母之外的其他地方包含“e”。
所以我的第一个问题是:
- 如何确保“e”是 仅位于第一个和 倒数第二个位置
- 如何创建一个智能函数,该函数将在谜题更新和计算机不断猜测时具有新的正则表达式?
例如,如果单词是猴子,则计算机将只给出----e- 第一步是它从字典中删除所有不是 6 个字母的单词,以及所有不完全符合“----e-”模板的单词,并将其放入一个 newList 中。 怎么做 我要这样做吗?
然后它会根据其中单词的相对频率计算一个新的频率字典 新列表。
我目前的做法是这样的:
cnt = Counter()
for words in dictionary:
for letters in words:
cnt[letters]+=1
这是最有效的方法吗?
然后它会使用 newfrequencyDict 来猜测最常见的字母,假设它有 还没被猜到。它会继续这样做,直到(希望)猜到这个词。
这是一种有效的算法吗?有更好的实现吗?
【问题讨论】:
-
这听起来像是一个刽子手求解程序而不是刽子手程序。
标签: python regex algorithm dictionary