Advent of Code 2025 挑战全手写代码 Day 1 - 秘密入口

🎄Advent of Code 2025 挑战全手写代码 Day 1 - 秘密入口


终于等到 AoC 2025 开赛啦!🎉 第一天题目 Secret Entrance 难度简单(一星⭐),主要考察对***循环结构(Circular Buffer)***的理解和模运算的运用。

advent-of-code-2025-day-1

📖 题目速览

题目地址:https://adventofcode.com/2025/day/1

我们在北极秘密入口遇到一个保险箱转盘,刻度 0-99,初始位置 50
输入是一串旋转指令(如 L68, R48)。

  • Part 1:统计每次旋转结束时,指针停在 0 的次数。
  • Part 2:统计旋转过程中(包含结束点)指针指向 0 的总次数。

💡 解题思路 (Python 🐍)

  1. 巧用取模 %
    转盘是环形的,Python 的模运算 % 就能搞定
    • 右转:(current + amount) % 100
    • 左转:(current - amount) % 100
    • Python 的 % 能完美处理负数(例如 -1 % 100 = 99),直接省去了繁琐的边界判断,代码瞬间清爽!
current: int = 50
out: int = 0

for direction, amount in self.sequence:
    match direction:
        case "R":
            current = (current + amount) % 100
        case "L":
            current = (current - amount) % 100

    if not current:
        out += 1
  1. Part 2 的优化陷阱
    题目提示可能会有像 R1000 这种大旋转。如果一步步模拟(for loop),效率会很低。
    • 数学解法:使用 divmod(amount, 100)
    • 整圈:商 (div) 表示转了几整圈,每圈必然经过一次 0。
    • 残余步数:余数 (mod) 是剩下的位移。只需判断这最后一段位移是否跨越了 0 界限(R 跨越 99->0,L 跨越 0->99)。
current: int = 50
out: int = 0

for direction, amount in self.sequence:
    div, mod = divmod(amount, 100)
    out += div

    match direction:
        case "R":
            if current + mod >= 100:
                out += 1

            current = (current + mod) % 100
        case "L":
            if current > 0 and mod >= current:
                out += 1

            current = (current - mod) % 100

return out

✨ 代码复盘
最终代码将“计算经过次数”和“更新位置”解耦,逻辑非常清晰。相比于暴力模拟,数学计算法不仅快,而且更能体现算法思维。

完整代码:访问 github

Happy Coding! 冲刺排行榜!🚀
day-1-snapshot

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值