Skip to content

11

https://adventofcode.com/2024/day/11

Prob

題目

給一條堆數字,每過一秒,每個數字都會根據下面規則產生變化 (使用優先符合條件的規則):

  1. 01
  2. 假如位數是偶數,那從中間切一半分裂成兩個數字,例如:
    1. 123412,34
    2. 120112, 1
  3. 都不符合以上條件則就變成 2024 倍,例如: 36072
  • Prob1:算 25 秒之後有幾個數字
  • Prob2:算 75 秒之後有幾個數字

作法

直接用 map: 數字 → 個數模擬,25 秒和 75 秒都可以短時間內跑出來。

python
import sys

def add_stone(d: dict, stone: int, stone_cnt: int):
    d.setdefault(stone, 0)
    d[stone] += stone_cnt

n = int(sys.argv[1])
stones = {}

for s in list(map(int, sys.stdin.readline().strip().split(' '))):
    add_stone(stones, s, 1)

for i in range(n):
    new_stones = {}
    for s, cnt in stones.items():
        if s == 0:
            add_stone(new_stones, 1, cnt)
        elif len(str(s)) % 2 == 0:
            str_stone = str(s)
            half_len = len(str_stone)//2
            add_stone(new_stones, int(str_stone[:half_len]), cnt)
            add_stone(new_stones, int(str_stone[half_len:]), cnt)
        else:
            add_stone(new_stones, s*2024, cnt)
    stones = new_stones

ans = 0
for _, cnt in stones.items():
    ans += cnt

print(ans)

Changelog

Just observe 👀