JonathanGupton

Advent of Code 2025 - Day 06 - Python

Dec 6th, 2025
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.87 KB | None | 0 0
  1. from dataclasses import dataclass
  2. import re
  3. from functools import reduce
  4. from typing import Sequence
  5. from operator import mul
  6.  
  7.  
  8. @dataclass(slots=True, frozen=True)
  9. class CephalopodMathInput:
  10.     nums: Sequence[Sequence[int]]
  11.     ops: Sequence[str]
  12.  
  13.     def compute(self) -> int:
  14.         total = 0
  15.         for i, op in enumerate(self.ops):
  16.             nums = [row[i] for row in self.nums]
  17.             match op:
  18.                 case "*":
  19.                     total += reduce(mul, nums, 1)
  20.                 case "+":
  21.                     total += sum(nums)
  22.         return total
  23.  
  24.  
  25. @dataclass(slots=True, frozen=True)
  26. class VerticalCephalopodMathInput:
  27.     nums: Sequence[Sequence[int]]
  28.     ops: Sequence[str]
  29.  
  30.     def compute(self) -> int:
  31.         total = 0
  32.         for i, group in enumerate(self.nums):
  33.             match self.ops[i]:
  34.                 case "*":
  35.                     total += reduce(mul, group, 1)
  36.                 case "+":
  37.                     total += sum(group)
  38.         return total
  39.  
  40.  
  41. def parse_data_horizontal(fp: str) -> CephalopodMathInput:
  42.     num_pattern = r"(\d+)"
  43.     op_pattern = r"([\*\+])"
  44.     nums = []
  45.     with open(fp, "r") as f:
  46.         for line in f.readlines():
  47.             if match := re.findall(num_pattern, line):
  48.                 nums.append(list(map(int, match)))
  49.             elif match := re.findall(op_pattern, line):
  50.                 ops = list(match)
  51.     return CephalopodMathInput(nums=nums, ops=ops)
  52.  
  53.  
  54. def parse_data_vertical(fp: str) -> VerticalCephalopodMathInput:
  55.     num_pattern = r"(\d+)"
  56.     op_pattern = r"([\*\+])"
  57.     num_as_str = []
  58.     with open(fp, "r") as f:
  59.         for line in f.readlines():
  60.             if re.search(num_pattern, line):
  61.                 num_as_str.append(line)
  62.             elif match := re.findall(op_pattern, line):
  63.                 ops = list(match)
  64.     nums: list[list[int]] = []
  65.     i = 0
  66.     grouping = []
  67.     while i < len(num_as_str[0]):
  68.         num = ""
  69.         for j in range(len(num_as_str)):
  70.             num += num_as_str[j][i]
  71.         if num.strip() == "":
  72.             nums.append(grouping)
  73.             grouping = []
  74.         else:
  75.             grouping.append(int(num.strip()))
  76.         i += 1
  77.     if grouping:
  78.         nums.append(grouping)
  79.     return VerticalCephalopodMathInput(nums=nums, ops=ops)
  80.  
  81.  
  82. def part_a():
  83.     """
  84.    >>> fp = "day06a.txt"
  85.    >>> v = parse_data_horizontal(fp)
  86.    >>> total = v.compute()
  87.    >>> assert total == 4277556
  88.    """
  89.     fp = "day06.txt"
  90.     v = parse_data_horizontal(fp)
  91.     total = v.compute()
  92.     print(total)
  93.  
  94.  
  95. def part_b():
  96.     """
  97.    >>> fp = "day06a.txt"
  98.    >>> v = parse_data_vertical(fp)
  99.    >>> total = v.compute()
  100.    >>> assert total == 3263827
  101.    """
  102.     fp = "day06.txt"
  103.     v = parse_data_vertical(fp)
  104.     total = v.compute()
  105.     print(total)
  106.  
  107.  
  108. if __name__ == "__main__":
  109.     part_a()
  110.     part_b()
  111.  
Add Comment
Please, Sign In to add comment