鱼C论坛

 找回密码
 立即注册
查看: 1580|回复: 5

求大神帮忙如何能过了最后的两个test case

[复制链接]
发表于 2023-9-24 15:06:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 根本学不完 于 2023-9-24 15:25 编辑

python ai wordmaker
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-24 15:06:35 | 显示全部楼层
根据给定的代码,你需要通过最后两个测试用例。这两个测试用例是test_letters_remaining()test_blackbox()

对于test_letters_remaining()测试用例,它首先创建一个WordMakerAI对象wm,然后使用reset(5)方法将词长设置为5。接下来,它循环迭代字符串to_guess中的每个字母,并调用guess()方法猜测该字母。最后,它断言get_amount_of_valid_words()方法的返回值应为287。

你需要检查以下几点以确保通过此测试用例:
1. 确保你的WordMakerAI类可以正确加载单词文件,并将单词存储在self.words列表中。
2. 确保在调用reset()方法后,word_length属性被正确设置为指定的词长。
3. 在guess()方法中,根据猜测的字母筛选出合法单词,并更新families字典。
4. 在get_amount_of_valid_words()方法中,计算符合指定词长的有效单词数量。

对于test_blackbox()测试用例,它首先创建一个WordMakerAI对象wm,并使用reset(6)方法将词长设置为6。然后,它循环迭代字符串to_guess中的每个字母,并调用guess()方法猜测该字母。最后,它断言get_valid_word()方法的返回值应为['petite', 'peyote', 'piquet', 'putout', 'puttee']中的一个,并且调用guess("e")方法返回的结果应为[1, 5]

你需要检查以下几点以确保通过此测试用例:
1. 在guess()方法中,根据猜测的字母筛选出合法单词,并更新families字典。
2. 确保sorted(positions)返回出现猜测字母的位置列表。
3. 在get_valid_word()方法中,返回合法单词列表中的一个。

请仔细检查代码,确保所有方法的实现正确,并且属性和变量被正确设置和使用。如果仍然不能通过测试用例,可以提供更具体的问题描述或错误提示,以便我能够提供更准确的帮助。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)

希望能对您有所帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-24 15:06:45 | 显示全部楼层
我注意到两个测试用例test_letters_remainingtest_blackbox。下面是如何通过这两个测试用例的建议:

## test_letters_remaining 测试用例

该测试用例验证了get_amount_of_valid_words方法是否正确计算了有效单词的数量。你可以按照以下步骤来通过该测试用例:

1. 确保你已经创建了一个WordMakerAI对象并加载了字典文件。
2. 调用reset方法,将word_length设置为5,以重置游戏状态。
3. 使用循环遍历字符串"aeiou"中的每个字母,并调用guess方法猜测该字母。
4. 最后,使用断言语句检查get_amount_of_valid_words方法是否返回了预期的结果287。

## test_blackbox 测试用例

该测试用例对整个游戏进行了更全面的测试,包括猜测字母、获取有效单词等功能。以下是通过该测试用例的步骤:

1. 创建一个新的WordMakerAI对象并加载字典文件。
2. 调用reset方法,将word_length设置为6,以重置游戏状态。
3. 使用循环遍历字符串"asdfghjklzxcvbnmrpw"中的每个字母,并调用guess方法猜测该字母。
4. 使用断言语句检查get_valid_word方法返回的有效单词是否在预期的列表中。
5. 使用断言语句检查guess方法返回的列表是否与预期的位置列表相匹配。
6. 使用断言语句检查get_amount_of_valid_words方法是否返回了预期的结果1。
7. 使用断言语句检查get_valid_word方法是否返回了预期的单词"peyote"。
8. 调用reset方法,将word_length设置为6,以确保reset方法能够正常工作。
9. 使用断言语句检查get_amount_of_valid_words方法是否不等于1。
10. 使用循环遍历字符串"asdfghjklzxcvbnmrpwet"中的每个字母,并调用guess方法猜测该字母。
11. 使用断言语句检查get_amount_of_valid_words方法是否返回了预期的结果1。
12. 使用断言语句检查get_valid_word方法是否返回了预期的单词"peyote"。

请注意,在运行测试用例之前,确保你的代码和测试文件位于同一个目录下,并且字典文件名为"dictionary.txt"。如果字典文件的路径不同,请相应地修改代码中的路径。完成上述步骤后,你应该能够通过这两个测试用例。

球一个最佳答案谢谢啦!这对我非常重要!
回答可能有误,多多谅解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-24 15:14:32 | 显示全部楼层
isdkz 发表于 2023-9-24 15:06
这段代码是一个单词猜测的AI,主要是实现了以下几个方法:

1.  __init__(self, words_file: str, verbos ...

test_word_maker_ai.py::test_letters_remaining FAILED                     [100%]
test_word_maker_ai.py:10 (test_letters_remaining)
470 != 287

Expected :287
Actual   :470
<Click to see difference>

def test_letters_remaining():
        wm = WordMakerAI("dictionary.txt")
        wm.reset(5)
        to_guess = "aeiou"
        for letter in list(to_guess):
            wm.guess(letter)
>       assert wm.get_amount_of_valid_words() == 287
E       assert 470 == 287
E        +  where 470 = <bound method WordMakerAI.get_amount_of_valid_words of <py_evil_hangman.word_maker.WordMakerAI object at 0x7f88802e4eb0>>()
E        +    where <bound method WordMakerAI.get_amount_of_valid_words of <py_evil_hangman.word_maker.WordMakerAI object at 0x7f88802e4eb0>> = <py_evil_hangman.word_maker.WordMakerAI object at 0x7f88802e4eb0>.get_amount_of_valid_words

test_word_maker_ai.py:17: AssertionError
---------------------------------------------------------------------------------------------------------------------------------------test_word_maker_ai.py::test_blackbox FAILED                              [100%]
test_word_maker_ai.py:18 (test_blackbox)
'pitier' != ['petite', 'peyote', 'piquet', 'putout', 'puttee']

Expected :['petite', 'peyote', 'piquet', 'putout', 'puttee']
Actual   :'pitier'
<Click to see difference>

def test_blackbox():
        wm = WordMakerAI("dictionary.txt")
        wm.reset(6)
        to_guess = "asdfghjklzxcvbnmrpw"
        for letter in list(to_guess):
            wm.guess(letter)
>       assert wm.get_valid_word() in ['petite', 'peyote', 'piquet', 'putout', 'puttee']
E       AssertionError: assert 'pitier' in ['petite', 'peyote', 'piquet', 'putout', 'puttee']
E        +  where 'pitier' = <bound method WordMakerAI.get_valid_word of <py_evil_hangman.word_maker.WordMakerAI object at 0x7fc4f8144df0>>()
E        +    where <bound method WordMakerAI.get_valid_word of <py_evil_hangman.word_maker.WordMakerAI object at 0x7fc4f8144df0>> = <py_evil_hangman.word_maker.WordMakerAI object at 0x7fc4f8144df0>.get_valid_word

test_word_maker_ai.py:25: AssertionError
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-24 15:19:46 | 显示全部楼层
test_word_maker_ai.py::test_blackbox FAILED                              [100%]
test_word_maker_ai.py:18 (test_blackbox)
'pitier' != ['petite', 'peyote', 'piquet', 'putout', 'puttee']

Expected :['petite', 'peyote', 'piquet', 'putout', 'puttee']
Actual   :'pitier'
<Click to see difference>

def test_blackbox():
        wm = WordMakerAI("dictionary.txt")
        wm.reset(6)
        to_guess = "asdfghjklzxcvbnmrpw"
        for letter in list(to_guess):
            wm.guess(letter)
>       assert wm.get_valid_word() in ['petite', 'peyote', 'piquet', 'putout', 'puttee']
E       AssertionError: assert 'pitier' in ['petite', 'peyote', 'piquet', 'putout', 'puttee']
E        +  where 'pitier' = <bound method WordMakerAI.get_valid_word of <py_evil_hangman.word_maker.WordMakerAI object at 0x7fc4f8144df0>>()
E        +    where <bound method WordMakerAI.get_valid_word of <py_evil_hangman.word_maker.WordMakerAI object at 0x7fc4f8144df0>> = <py_evil_hangman.word_maker.WordMakerAI object at 0x7fc4f8144df0>.get_valid_word

test_word_maker_ai.py:25: AssertionError
--------------------------------------------------------------------------------------------------
test_word_maker_ai.py::test_letters_remaining FAILED                     [100%]
test_word_maker_ai.py:10 (test_letters_remaining)
470 != 287

Expected :287
Actual   :470
<Click to see difference>

def test_letters_remaining():
        wm = WordMakerAI("dictionary.txt")
        wm.reset(5)
        to_guess = "aeiou"
        for letter in list(to_guess):
            wm.guess(letter)
>       assert wm.get_amount_of_valid_words() == 287
E       assert 470 == 287
E        +  where 470 = <bound method WordMakerAI.get_amount_of_valid_words of <py_evil_hangman.word_maker.WordMakerAI object at 0x7f88802e4eb0>>()
E        +    where <bound method WordMakerAI.get_amount_of_valid_words of <py_evil_hangman.word_maker.WordMakerAI object at 0x7f88802e4eb0>> = <py_evil_hangman.word_maker.WordMakerAI object at 0x7f88802e4eb0>.get_amount_of_valid_words

test_word_maker_ai.py:17: AssertionError

任何方法能过test就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 11:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表