You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Advent of Code任务:修复无法筛选含奇偶数字符串的Python函数

修复Advent of Code密码筛选逻辑

你的核心问题出在one_even_one_odd函数的逻辑错误,导致无法正确筛选同时包含奇偶数字的密码。下面是具体问题和修复方案:

原函数的核心错误

  1. 无效的字符串运算:pass_str % 2是对整个字符串执行取模操作,Python中字符串不支持这类运算,且你试图让单个字符同时满足奇偶(逻辑上不可能),导致函数始终返回False。
  2. 筛选逻辑反向:你的代码中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()

修复要点说明

  1. 正确的奇偶跟踪逻辑:通过两个布尔变量分别记录是否存在偶数和奇数,遍历完成后返回两者的逻辑与,确保密码同时包含两类数字。
  2. 字符转数字判断:将每个字符转为整数后再判断奇偶,避免字符串与数字的无效比较。
  3. 动态遍历兼容长度:不再固定遍历5次(你的密码范围是6位数字),而是遍历字符串的每个字符,适配不同长度的密码。
  4. 提前终止优化:一旦同时找到奇偶数字,直接返回True,减少不必要的遍历操作。

修改后,测试用例中的111(全奇)、222(全偶)会被过滤,仅保留112这类符合要求的密码。

内容的提问来源于stack exchange,提问作者Zeorth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:20:34