JonathanGupton

Advent of Code 2025 - Day 03 - Python

Dec 3rd, 2025
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.50 KB | None | 0 0
  1. # Advent of Code 2025 Day 3
  2. from typing import Callable
  3. from typing import Iterable
  4.  
  5. Battery = tuple[int, ...]
  6.  
  7.  
  8. def parse_data(fp: str) -> list[Battery]:
  9.     with open(fp, "r") as f:
  10.         return [tuple(map(int, line.strip())) for line in f.readlines()]
  11.  
  12.  
  13. def find_max_value(battery: Battery, n_nums: int) -> int:
  14.     left_len = len(battery) - n_nums + 1
  15.     left_max = 0
  16.     left_start = 0
  17.     for i, v in enumerate(battery[:left_len]):
  18.         left_start = i if v > left_max else left_start
  19.         left_max = v if v > left_max else left_max
  20.     next_n_nums = n_nums - 1
  21.     if next_n_nums == 0:
  22.         return left_max
  23.     else:
  24.         next_val = find_max_value(battery[left_start + 1 :], next_n_nums)
  25.         return int(str(left_max) + str(next_val))
  26.  
  27.  
  28. def find_2_max_values(battery: Battery) -> int:
  29.     """
  30.    >>> assert find_2_max_values(list(map(int, "987654321111111"))) == 98
  31.    >>> assert find_2_max_values(list(map(int, "811111111111119"))) == 89
  32.    >>> assert find_2_max_values(list(map(int, "234234234234278"))) == 78
  33.    >>> assert find_2_max_values(list(map(int, "818181911112111"))) == 92
  34.    """
  35.     return find_max_value(battery, 2)
  36.  
  37.  
  38. def find_12_max_values(battery: Battery) -> int:
  39.     """
  40.    >>> assert find_12_max_values(list(map(int, "987654321111111"))) == 987654321111
  41.    >>> assert find_12_max_values(list(map(int, "811111111111119"))) == 811111111119
  42.    >>> assert find_12_max_values(list(map(int, "234234234234278"))) == 434234234278
  43.    >>> assert find_12_max_values(list(map(int, "818181911112111"))) == 888911112111
  44.    """
  45.     return find_max_value(battery, 12)
  46.  
  47.  
  48. def compute_total_joltage(
  49.     batteries: Iterable[Battery],
  50.     calc_func: Callable[[Battery], int] = find_2_max_values,
  51. ) -> int:
  52.     return sum(calc_func(battery) for battery in batteries)
  53.  
  54.  
  55. def part_a():
  56.     """
  57.    >>> fp = "day03a.txt"
  58.    >>> batteries = parse_data(fp)
  59.    >>> assert compute_total_joltage(batteries, find_2_max_values) == 357
  60.    """
  61.     fp = "day03.txt"
  62.     batteries = parse_data(fp)
  63.     total_joltage = compute_total_joltage(batteries)
  64.     print(total_joltage)
  65.  
  66.  
  67. def part_b():
  68.     """
  69.    >>> fp = "day03a.txt"
  70.    >>> batteries = parse_data(fp)
  71.    >>> assert compute_total_joltage(batteries, find_12_max_values) == 3121910778619
  72.    """
  73.     fp = "day03.txt"
  74.     batteries = parse_data(fp)
  75.     total_joltage = compute_total_joltage(batteries, find_12_max_values)
  76.     print(total_joltage)
  77.  
  78.  
  79. if __name__ == "__main__":
  80.     part_a()
  81.     part_b()
  82.  
Advertisement
Add Comment
Please, Sign In to add comment