Advent of Code任务:修复无法筛选含奇偶数字符串的Python函数
修复Advent of Code密码筛选逻辑
你的核心问题出在one_even_one_odd函数的逻辑错误,导致无法正确筛选同时包含奇偶数字的密码。下面是具体问题和修复方案:
原函数的核心错误
- 无效的字符串运算:
pass_str % 2是对整个字符串执行取模操作,Python中字符串不支持这类运算,且你试图让单个字符同时满足奇偶(逻辑上不可能),导致函数始终返回False。 - 筛选逻辑反向:你的代码中
if not one_even_one_odd(pass_str): continue意味着当函数返回False时(即密码不符合要求),不会跳过该密码,反而全部保留,最终导致所有非递减的密码都被输出。
修复后的完整代码
def one_even_one_odd(pass_str: str) -> bool: has_even = False has_odd = False for char in pass_str: digit = int(char) if digit % 2 == 0: has_even = True else: has_odd = True # 提前终止:已找到奇偶数字,无需继续遍历 if has_even and has_odd: return True # 遍历结束后确认是否同时包含奇偶 return has_even and has_odd def result(range_from: int, range_to: int) -> tuple[int, list[str]]: amount_passwords = 0 each_password = [] for password in range(range_from, range_to + 1): pass_str = str(password) # 检查密码是否非递减 if pass_str != ''.join(sorted(pass_str)): continue # 检查是否同时包含奇偶数字 if not one_even_one_odd(pass_str): continue each_password.append(pass_str) amount_passwords += 1 return amount_passwords, each_password def main(): range_from = 138345 range_to = 836215 count, passwords = result(range_from, range_to) print(f'符合要求的密码数量:{count}') print(f'密码列表:{passwords}') if __name__ == "__main__": main()
修复要点说明
- 正确的奇偶跟踪逻辑:通过两个布尔变量分别记录是否存在偶数和奇数,遍历完成后返回两者的逻辑与,确保密码同时包含两类数字。
- 字符转数字判断:将每个字符转为整数后再判断奇偶,避免字符串与数字的无效比较。
- 动态遍历兼容长度:不再固定遍历5次(你的密码范围是6位数字),而是遍历字符串的每个字符,适配不同长度的密码。
- 提前终止优化:一旦同时找到奇偶数字,直接返回
True,减少不必要的遍历操作。
修改后,测试用例中的111(全奇)、222(全偶)会被过滤,仅保留112这类符合要求的密码。
内容的提问来源于stack exchange,提问作者Zeorth
相关产品推荐
相关产品推荐

