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

Advent of Code 2021 Day6 灯笼鱼问题deque实现结果异常调试求助

调试建议与问题根源

快速调试步骤

  • 先实现最简分组版本验证逻辑:直接用长度为9的数组存储计时器0~8对应的鱼的数量,更新逻辑如下:
    def count_lanternfish(initial, days):
        counts = [0]*9
        for n in initial:
            counts[n] += 1
        for _ in range(days):
            zero = counts.pop(0)
            counts[6] += zero # 繁殖的鱼重置计时器为6
            counts.append(zero) # 新生鱼计时器为8
        return sum(counts)
    # 测试用例验证
    print(count_lanternfish([3,4,3,1,2], 18)) # 输出26
    print(count_lanternfish([3,4,3,1,2], 80)) # 输出5934
    
    这个版本逻辑极简几乎不会出错,先跑通测试用例,再对照你的现有实现逐一比对差异,定位效率最高。
  • 逐天对齐统计结果:你日志中第17天总鱼数就已经达到26(对应正确的18天结果),说明初始天数存在1天的偏移,你的初始状态直接将day设为1,而题目初始状态是第0天,需要先对齐天数基准。
  • 核对计数逻辑:你当前代码的核心bug是重复计数:update方法中将pool_2_update位置的鱼的数量放入孵化池时,没有从原位置减去对应的数值,相当于这批鱼同时被算在成鱼池和孵化池中,越往后总数量偏差越大。
  • 简化移位逻辑:用deque存储所有9个计时器的计数,直接用popleft+append实现移位,比模运算更直观,不易出现索引错位问题。

核心问题修正方向

你拆分孵化池和成鱼池的思路本身是成立的,但需要调整更新顺序:

  1. 每天先取出成鱼池索引0位置的鱼的数量(计时器到0需要繁殖的鱼)
  2. 将该数量加入孵化池,同时将该数量加回成鱼池索引6的位置(原鱼重置计时器)
  3. 取出孵化池最早的一批鱼,加入成鱼池索引6的位置(孵化完成的鱼进入繁殖周期)
  4. 总数量为成鱼池总和加孵化池总和,不会出现重复计数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:27:08