Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Advent of Code 2025 Day 3
- from typing import Callable
- from typing import Iterable
- Battery = tuple[int, ...]
- def parse_data(fp: str) -> list[Battery]:
- with open(fp, "r") as f:
- return [tuple(map(int, line.strip())) for line in f.readlines()]
- def find_max_value(battery: Battery, n_nums: int) -> int:
- left_len = len(battery) - n_nums + 1
- left_max = 0
- left_start = 0
- for i, v in enumerate(battery[:left_len]):
- left_start = i if v > left_max else left_start
- left_max = v if v > left_max else left_max
- next_n_nums = n_nums - 1
- if next_n_nums == 0:
- return left_max
- else:
- next_val = find_max_value(battery[left_start + 1 :], next_n_nums)
- return int(str(left_max) + str(next_val))
- def find_2_max_values(battery: Battery) -> int:
- """
- >>> assert find_2_max_values(list(map(int, "987654321111111"))) == 98
- >>> assert find_2_max_values(list(map(int, "811111111111119"))) == 89
- >>> assert find_2_max_values(list(map(int, "234234234234278"))) == 78
- >>> assert find_2_max_values(list(map(int, "818181911112111"))) == 92
- """
- return find_max_value(battery, 2)
- def find_12_max_values(battery: Battery) -> int:
- """
- >>> assert find_12_max_values(list(map(int, "987654321111111"))) == 987654321111
- >>> assert find_12_max_values(list(map(int, "811111111111119"))) == 811111111119
- >>> assert find_12_max_values(list(map(int, "234234234234278"))) == 434234234278
- >>> assert find_12_max_values(list(map(int, "818181911112111"))) == 888911112111
- """
- return find_max_value(battery, 12)
- def compute_total_joltage(
- batteries: Iterable[Battery],
- calc_func: Callable[[Battery], int] = find_2_max_values,
- ) -> int:
- return sum(calc_func(battery) for battery in batteries)
- def part_a():
- """
- >>> fp = "day03a.txt"
- >>> batteries = parse_data(fp)
- >>> assert compute_total_joltage(batteries, find_2_max_values) == 357
- """
- fp = "day03.txt"
- batteries = parse_data(fp)
- total_joltage = compute_total_joltage(batteries)
- print(total_joltage)
- def part_b():
- """
- >>> fp = "day03a.txt"
- >>> batteries = parse_data(fp)
- >>> assert compute_total_joltage(batteries, find_12_max_values) == 3121910778619
- """
- fp = "day03.txt"
- batteries = parse_data(fp)
- total_joltage = compute_total_joltage(batteries, find_12_max_values)
- print(total_joltage)
- if __name__ == "__main__":
- part_a()
- part_b()
Advertisement
Add Comment
Please, Sign In to add comment