🎄Advent of Code 2025 挑战全手写代码 Day 6 - 垃圾场
周末好!今天题目 Trash Compactor,难度简单(⭐⭐),主要考察:数组/矩阵遍历、字符串操作、数学运算、边界条件。

📖 题目速览
题目地址:https://adventofcode.com/2025/day/6
掉进垃圾压缩机还能遇上乌贼一家?还得帮人家写作业?这剧情走向也是没谁了…
不过今天的题目倒是很有意思,看似复杂的排版,其实暗藏玄机!
👀 题目大意
题目给了一张写满数学题的“试卷”,但是排版很奇葩:
- Part 1:数字是横着写的,但是题目之间混在一起。
- Part 2:反转了!数字是竖着写的(每列一个数),而且题目说要“从右向左”读。
🧠 脑洞时刻
乍一看 Part 2 好像要搞什么矩阵转置或者复杂的切割逻辑?
其实仔细一想,题目里只有加法(+)和乘法(*)。
众所周知,这俩货都支持交换律!(a + b = b + a)
所以,题目要求的“从右向左”读,其实从左向右扫也是一样的结果!
我直接采用了一种流式处理 (Streaming) 的思路:
- 不去费劲把题目切成一块一块的。
- 直接从左到右遍历每一列。
- 利用底部的运算符行作为状态切换的信号。
- 遇到非空的运算符(
+或*),说明上一个数(或上一个题)结束了。 - 结算之前的
current结果,加到总和out里。 - 重置
current(乘法重置为1,加法重置为0)。
- 遇到非空的运算符(
- 对于每一列,直接提取这一列里的数字拼起来,累积到
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! 完成今天的题目,我们的旅程就已经过半了,继续加油!🚀

611

被折叠的 条评论
为什么被折叠?



