寻找最大葫芦-试错和纠正 | 豆包MarsCode AI刷题

98 阅读6分钟

第一次bug

给的思路是:我们需要在给定的牌组中找到一个符合条件的“葫芦”组合。具体来说,“葫芦”由三张相同牌面值的牌和两张相同牌面值的牌组成,并且这些牌的面值之和不能超过给定的最大值 max。 由于牌面值的大小规则是 A > K > Q > J > 10 > 9 > ... > 2,我们可以将这些牌面值映射到一个整数数组中,方便后续的比较和计算。使用字典来计数。

刚开始看这里的时候以为这个牌面值就用了1-13的数组,结果之后ai给的提示代码是用的字典来映射。

card_value = {
        'A': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,
        '10': 10, 'J': 11, 'Q': 12, 'K': 13
    }

但这里存在问题,给出的输入样例是:

n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1]

首先可以看到,给定输入数组中并没有'A'、'J'、'Q'、K',因此这里的映射会出现1、11、12、13没有对应映射的情况,其次,给出的代码中使用array中的元素值作为计数字典的key,是int类型,而牌面值的key是string类型,这里提示的代码没有统一,造成key不存在的bug。

给了AI提示:输入的值没有'A','J',应该改为1,11作为字典的键值,并且card_value和count两个字典的key应统一,都使用string或者都使用int。

第二次bug

  • 之后ai给出的代码正确的改正了这里,但仍然有bug,KeyError:0,这次懒得去找问题出在哪里,直接将报错信息丢给ai。
def solution(n, max_value, array):
    # 将德州扑克的牌面值转换为排序权重
    card_value = {
        1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9,
        10: 10, 11: 11, 12: 12, 13: 13
    }
    
    # 统计每种牌面值的出现次数
    count = {}
    for card in array:
        if card in count:
            count[card] += 1
        else:
            count[card] = 1
    
    # 初始化结果
    best_three = 0
    best_two = 0
    
    # 遍历字典,找到所有可能的三张相同牌面值的组合
    for three_card in count:
        if count[three_card] >= 3:
            # 对于每个三张相同牌面值的组合,再遍历字典,找到所有可能的两张相同牌面值的组合
            for two_card in count:
                if two_card != three_card and count[two_card] >= 2:
                    # 计算这些组合的牌面值之和,并检查是否不超过 max_value
                    total_value = card_value[three_card] * 3 + card_value[two_card] * 2
                    if total_value <= max_value:
                        # 记录符合条件的最大“葫芦”组合
                        if card_value[three_card] > card_value[best_three] or (card_value[three_card] == card_value[best_three] and card_value[two_card] > card_value[best_two]):
                            best_three = three_card
                            best_two = two_card
    
    # 返回结果
    if best_three == 0:
        return [0, 0]
    else:
        return [best_three, best_two]


if __name__ == "__main__":
    # Add your test cases here

    print(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]) == [8, 5])
    print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) == [6, 9])
    print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) == [0, 0])

#报错在这里
File "/cloudide/workspace/daimalianxi/topic/v2/88/python/main.py", line 30, in solution if card_value[three_card] > card_value[best_three] or (card_value[three_card] == card_value[best_three] and card_value[two_card] > card_value[best_two]): ~~~~~~~~~~^^^^^^^^^^^^ KeyError: 0

给出问题所在:

  • best_three 和 best_two 的初始值是 0
  • 在 card_value 字典中没有键 0,因此当我们尝试访问 card_value[0] 时会引发 KeyError

解决方案:我们需要确保在比较 card_value[best_three] 和 card_value[best_two] 时,best_three 和 best_two 的值是有效的牌面值。

第三次无bug,但测试不通过

修改之后,前三个测试用例通过,但提交的时候发现第四个测试案例没有通过

n=31
max=42
array=[3,3,11,12,12,2,13,5,13,1,13,8,8,1,8,13,12,9,2,11,3,5,8,11,1,11,1,5,4,2,5]

代码得到的输出是[13,1],而预期输出是[1,13],将该测试样例和输出结果以及预期输出丢给AI,但并没有用,AI没有找到问题所在,新给出的代码仍然是相同的问题,于是乎,我开始找寻问题所在,看了一下,是因为AI将牌值的大小搞混了,A的牌值是1,但它是最大的牌,因此会出现顺序问题,代码把1当成了最小牌面值,而实际上1是最大的牌面值。

  • 于是再次给出提示:你应该是搞混了牌面值大小,A的牌面值为1,但它是最大的牌面值,也就是1是最大的
  • 但是AI直接把A的牌面值设为14,表示其最大,王德发!!这完全就不符合题目输入了,于是只能再次给出提示:你不能把A的牌面值设为14,你可以说它的权重最大,但牌面值不能变。
  • but,它是真犟,仍然设为14

我:那你这样计算的时候不就出错了,1的牌面值就是1,加和的时候你得用1,只不过它的权重大 AI:明白了,我们需要确保在比较时 A 的权重最大,但在最终输出时,A 的牌面值为 1。我们可以通过在比较时使用一个特殊的权重字典,而在输出时使用原始的牌面值。
我:你明白个勾八,你计算的时候咋还用了14 AI:非常抱歉,我之前的解释有误。根据题目描述,A 的牌面值为 1,但它是最大的牌面值。我们需要在比较时将 A 视为最大的牌面值,但在输出时保持其原始值。
我:你计算的时候,加和的时候A应该就用1,但它牌面值确实是最大的
AI:明白了,我们需要在计算总和时使用 A 的实际牌面值 1,但在比较时将其视为最大的牌面值。我们可以通过在比较时使用一个特殊的权重字典,而在计算总和时使用原始的牌面值。

  • 最后看样子它好像理解了,但代码仍然改不正确,于是放弃。最后丢给gpt了,一开始也有[13,1]和[1,13]的问题,给它提示后改正,最终提交通过。附上代码:
from collections import Counter

def solution(n, max_value, array):
    # 将德州扑克的牌面值转换为排序权重
    def card_value(card):
        return 14 if card == 1 else card  # 把 A(1)视为 14

    # 统计每个牌面的出现次数
    counter = Counter(array)
    
    # 找到可能的三张和两张的组合
    possible_combinations = []
    for card in counter:
        if counter[card] >= 3:
            for other_card in counter:
                if other_card != card and counter[other_card] >= 2:
                    # 计算组合的牌面值之和
                    total_value = card * 3 + other_card * 2
                    if total_value <= max_value:
                        possible_combinations.append((card, other_card))
    
    # 排序,先按三张牌的值排序(A最大),再按两张牌的值排序
    possible_combinations.sort(key=lambda x: (card_value(x[0]), card_value(x[1])), reverse=True)
    
    # 如果找到了有效的组合,返回最优的组合,否则返回 [0, 0]
    if possible_combinations:
        return list(possible_combinations[0])
    else:
        return [0, 0]

总结:像运行bug这样的错误,AI大部分能解决问题,但像一些逻辑错误,可能它就发现不了,需要人为的给提示来改正,当然,可能需要提示的水平高一点,我的表达能力不好,导致AI一直在错误答案反复横跳