|
发表于 2023-9-24 15:06:37
|
显示全部楼层
这段代码是一个单词猜测的AI,主要是实现了以下几个方法:
1. __init__(self, words_file: str, verbose=False) :初始化单词列表,从文件中读取单词并存储在self.words中;
2. reset(self, word_length: int) -> None :重置单词长度;
3. get_valid_word(self) -> str :获取一个有效的单词;
4. get_amount_of_valid_words(self) -> int :获取有效单词的数量;
5. get_letter_positions_in_word(self, word: str, guess_letter: str) -> tuple[int, ...] :获取一个字母在单词中的位置;
6. guess(self, guess_letter) -> list[int] :猜测一个字母。
现在的问题是如何让代码通过最后两个测试用例。
第一个测试用例是 test_blackbox() ,它测试了一个单词长度为6的情况。在这个测试用例中,我们需要找到一个单词,它的字母位置与之前猜测的字母位置匹配。我们可以通过以下方式来实现:
1. 在 guess() 方法中,我们已经将单词按照字母位置分成了不同的家族,每个家族都有相同的字母位置。我们可以选择最大的家族(即包含单词最多的家族)作为下一步猜测的单词家族;
2. 对于选择的家族,我们可以选择其中的第一个单词作为下一步猜测的单词;
3. 对于猜测的字母,我们可以选择其中出现位置最靠前的一个位置作为返回值。
第二个测试用例是 test_letters_remaining() ,它测试了一个单词长度为5的情况。在这个测试用例中,我们需要找到一个单词,它包含给定的五个字母。我们可以通过以下方式来实现:
1. 在初始化时,我们将单词列表存储在 self.words 中;
2. 在每次猜测时,我们可以根据已经猜测的字母来过滤单词列表,只保留包含这些字母的单词;
3. 最后,我们可以通过 get_amount_of_valid_words() 方法来获取剩余的单词数量。
综上所述,以下是修改后的代码:
class WordMakerAI():
def __init__(self, words_file: str, verbose=False):
self.verbose = verbose
self.words = []
with open(words_file) as file_obj:
for line in file_obj:
word = line.strip()
self.words.append(word)
def reset(self, word_length: int) -> None:
self.word_length = word_length
self.words = [word for word in self.words if len(word) == self.word_length]
def get_valid_word(self) -> str:
return self.words[0] if self.words else ""
def get_amount_of_valid_words(self) -> int:
return len(self.words)
def get_letter_positions_in_word(self, word: str, guess_letter: str) -> tuple[int, ...]:
positions = [index for index, letter in enumerate(word) if letter == guess_letter]
return tuple(positions)
def guess(self, guess_letter) -> list[int]:
families = {}
for word in self.words:
positions = self.get_letter_positions_in_word(word, guess_letter)
key = tuple([position != -1 for position in positions])
if key not in families:
families[key] = []
families[key].append(word)
sorted_families = sorted(families.items(), key=lambda x: (len(x[1]), -sum(x[0])), reverse=True)
selected_families = sorted_families[0][1]
selected_word = selected_families[0]
self.words = [word for word in selected_families if word != selected_word]
positions = self.get_letter_positions_in_word(selected_word, guess_letter)
return sorted(positions)
希望能对您有所帮助。 |
|