我正在做一个挂机的算法,可以很好地猜测这个词,但它并没有完全按照预期的工作。它应该是检查字符的具体位置,但它并没有真正发挥作用。例如,我就用土豚这个词。它猜对的第一个字母是a,而ardvark包含3个a,所以算法看到了这个。
aa_ _ _ _ a _ _
但是当我检查可能的单词时,大多数单词都不像这样,算法应该马上就能解决,因为只有它是唯一一个像这样的单词。
程序中有删除包含错误猜测字母的单词的功能,还有一个猜测最优字母的功能。这两个函数都能完美地工作。
这是代码中不起作用的部分,应该是检查字母的位置。
def narrowdown(guessedword, possible):
for i in guessedword:
if i != "_":
for j in possible:
k = list(j)
if k[guessedword.index(i)] != i:
possible.remove(j)
这里,guessedword是猜测者能看到的字母的列表版本,而possible是猜测的单词的列表。"_"是猜词者看不到的空白字母。
每猜中一个单词后,它都会重复这个功能。
问题是,它包括了一些肯定不合格的单词。例如,我再用ardvark。
当这个词看起来像这样的时候:aa_ _ _ _。a _ _
而猜错的字母是e,i,s和u,它仍然显示这些单词。
['ardvark', 'ardvolf', 'abnormal', 'adorably', 'advocacy', 'agaragar', 'agronomy', 'anaconda', 'anaphora', 'approval', 'arrogant', 'atomb']
我说过,土豚是唯一一个符合所有这些条件的词,但算法还是要多猜3次才能找出是哪个词。
谁有办法解决这个问题?
多行解法。
def narrowdown(guessedword, possible):
res = []
for w in possible:
if (len(w) == len(guessedword)) and all((c1 == "_") or (c1 == c2) for c1, c2 in zip(guessedword, w)):
res.append(w)
return res
words = ['aardvark', 'aardwolf', 'abnormal', 'adorably', 'advocacy', 'agaragar', 'agronomy', 'anaconda', 'anaphora', 'approach', 'approval', 'arrogant', 'atombomb']
mask = "aa___a__"
print(narrowdown(mask, words))
单行方案:
def narrowdown(gw, p):
return [w for w in p if (len(w) == len(gw)) and all((c1 == "_") or (c1 == c2) for c1, c2 in zip(gw, w))]
words = ['aardvark', 'aardwolf', 'abnormal', 'adorably', 'advocacy', 'agaragar', 'agronomy', 'anaconda', 'anaphora', 'approach', 'approval', 'arrogant', 'atombomb']
mask = "aa___a__"
print(narrowdown(mask, words))