Advent of Code 2025 挑战全手写代码 Day 6 - 垃圾场

🎄Advent of Code 2025 挑战全手写代码 Day 6 - 垃圾场


周末好!今天题目 Trash Compactor,难度简单(⭐⭐),主要考察:数组/矩阵遍历、字符串操作、数学运算、边界条件。

advent-of-code-2025-day-6
📖 题目速览

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

掉进垃圾压缩机还能遇上乌贼一家?还得帮人家写作业?这剧情走向也是没谁了…
不过今天的题目倒是很有意思,看似复杂的排版,其实暗藏玄机!

👀 题目大意

题目给了一张写满数学题的“试卷”,但是排版很奇葩:

  • Part 1:数字是横着写的,但是题目之间混在一起。
  • Part 2:反转了!数字是竖着写的(每列一个数),而且题目说要“从右向左”读。

🧠 脑洞时刻

乍一看 Part 2 好像要搞什么矩阵转置或者复杂的切割逻辑?
其实仔细一想,题目里只有加法(+)和乘法(*)。
众所周知,这俩货都支持交换律!(a + b = b + a)

所以,题目要求的“从右向左”读,其实从左向右扫也是一样的结果!

我直接采用了一种流式处理 (Streaming) 的思路:

  1. 不去费劲把题目切成一块一块的。
  2. 直接从左到右遍历每一列。
  3. 利用底部的运算符行作为状态切换的信号。
    • 遇到非空的运算符(+*),说明上一个数(或上一个题)结束了。
    • 结算之前的 current 结果,加到总和 out 里。
    • 重置 current(乘法重置为1,加法重置为0)。
  4. 对于每一列,直接提取这一列里的数字拼起来,累积到 current 里。

✨ 代码精华

# 假装是伪代码的真代码
for idx in range(len(self.raw_operators)):
    # 遇到运算符,说明是新的一组(或者是这一列不仅有数字还有运算符)
    # 这里我的逻辑有点 trick:把运算符当作"结算点"
    if self.raw_operators[idx] != " ":
        out += current  # 结算旧账
        operator = self.raw_operators[idx]
        # 重置状态
        current = 1 if operator == "*" else 0

    # 提取这一列的数字
    digits = [row[idx] for row in self.raw_rows if row[idx].isdigit()]
    
    if digits:
        # 竖着拼数字,再运算
        num = int("".join(digits))
        if operator == "*":
            current *= num
        else:
            current += num

# 别忘了最后一笔账
out += current

这种写法不用任何复杂的切片或正则,一个循环撸到底,逻辑极其清爽!
有时候别被题目的描述带跑偏,抓住运算的本质(交换律),能省下大把掉头发的时间!💆‍♂️
完整代码:访问 github

Happy Coding! 完成今天的题目,我们的旅程就已经过半了,继续加油!🚀

day-6-ranking

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值