Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from dataclasses import dataclass
- import re
- from functools import reduce
- from typing import Sequence
- from operator import mul
- @dataclass(slots=True, frozen=True)
- class CephalopodMathInput:
- nums: Sequence[Sequence[int]]
- ops: Sequence[str]
- def compute(self) -> int:
- total = 0
- for i, op in enumerate(self.ops):
- nums = [row[i] for row in self.nums]
- match op:
- case "*":
- total += reduce(mul, nums, 1)
- case "+":
- total += sum(nums)
- return total
- @dataclass(slots=True, frozen=True)
- class VerticalCephalopodMathInput:
- nums: Sequence[Sequence[int]]
- ops: Sequence[str]
- def compute(self) -> int:
- total = 0
- for i, group in enumerate(self.nums):
- match self.ops[i]:
- case "*":
- total += reduce(mul, group, 1)
- case "+":
- total += sum(group)
- return total
- def parse_data_horizontal(fp: str) -> CephalopodMathInput:
- num_pattern = r"(\d+)"
- op_pattern = r"([\*\+])"
- nums = []
- with open(fp, "r") as f:
- for line in f.readlines():
- if match := re.findall(num_pattern, line):
- nums.append(list(map(int, match)))
- elif match := re.findall(op_pattern, line):
- ops = list(match)
- return CephalopodMathInput(nums=nums, ops=ops)
- def parse_data_vertical(fp: str) -> VerticalCephalopodMathInput:
- num_pattern = r"(\d+)"
- op_pattern = r"([\*\+])"
- num_as_str = []
- with open(fp, "r") as f:
- for line in f.readlines():
- if re.search(num_pattern, line):
- num_as_str.append(line)
- elif match := re.findall(op_pattern, line):
- ops = list(match)
- nums: list[list[int]] = []
- i = 0
- grouping = []
- while i < len(num_as_str[0]):
- num = ""
- for j in range(len(num_as_str)):
- num += num_as_str[j][i]
- if num.strip() == "":
- nums.append(grouping)
- grouping = []
- else:
- grouping.append(int(num.strip()))
- i += 1
- if grouping:
- nums.append(grouping)
- return VerticalCephalopodMathInput(nums=nums, ops=ops)
- def part_a():
- """
- >>> fp = "day06a.txt"
- >>> v = parse_data_horizontal(fp)
- >>> total = v.compute()
- >>> assert total == 4277556
- """
- fp = "day06.txt"
- v = parse_data_horizontal(fp)
- total = v.compute()
- print(total)
- def part_b():
- """
- >>> fp = "day06a.txt"
- >>> v = parse_data_vertical(fp)
- >>> total = v.compute()
- >>> assert total == 3263827
- """
- fp = "day06.txt"
- v = parse_data_vertical(fp)
- total = v.compute()
- print(total)
- if __name__ == "__main__":
- part_a()
- part_b()
Add Comment
Please, Sign In to add comment