11
https://adventofcode.com/2024/day/11
Prob
題目
給一條堆數字,每過一秒,每個數字都會根據下面規則產生變化 (使用優先符合條件的規則):
0
→1
- 假如位數是偶數,那從中間切一半分裂成兩個數字,例如:
1234
→12
,34
1201
→12
,1
- 都不符合以上條件則就變成 2024 倍,例如:
3
→6072
- 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)