Python编写珠玑妙算(Mastermind)校验函数如何处理重复值问题
珠玑妙算校验函数修复方案
原代码问题根源
- 使用
list.index()获取元素位置,该方法遇到重复值时只会返回第一个匹配项的索引,无法区分重复元素的不同位置 - 没有对已完成匹配的答案元素做标记,同一个答案元素会被多次匹配,导致统计结果虚高
正确实现逻辑
- 优先统计**完全匹配(位置、数值均正确)**的条目,同时将已匹配的位置标记为已使用,避免后续重复统计
- 分别统计未匹配的答案、猜测列表中各数字的出现频次,每个数字取两个频次的最小值累加,得到数值正确、位置错误的总数量
可直接使用的代码
def check_guess(guess, anslist): # guess和anslist均为单字符组成的列表,对应猜测值和答案的每一位 true_matches = 0 part_matches = 0 # 标记已匹配的位置,避免重复统计 ans_used = [False] * len(anslist) guess_used = [False] * len(guess) # 第一步:统计完全匹配 for idx in range(len(guess)): if guess[idx] == anslist[idx]: true_matches += 1 ans_used[idx] = True guess_used[idx] = True # 统计剩余未匹配答案的数字频次 ans_remain_freq = {} for idx in range(len(anslist)): if not ans_used[idx]: ans_remain_freq[anslist[idx]] = ans_remain_freq.get(anslist[idx], 0) + 1 # 第二步:统计部分匹配 for idx in range(len(guess)): current_num = guess[idx] if not guess_used[idx] and current_num in ans_remain_freq and ans_remain_freq[current_num] > 0: part_matches += 1 ans_remain_freq[current_num] -= 1 return true_matches, part_matches
测试验证
以你给出的场景测试:
答案:
['5','1','9']
猜测:['5','9','9']
调用函数返回结果为(2, 0),与预期输出一致。
内容的提问来源于stack exchange,提问作者HiddenToad
相关产品推荐
相关产品推荐

