-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday7.py
55 lines (38 loc) · 1.32 KB
/
day7.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import sys
from dataclasses import dataclass
from operator import add, mul
from pathlib import Path
@dataclass
class Equation:
expected: int
xs: list[int]
def parse_input(lines):
def parse_line(line):
match line.split(": "):
case [ss, xs]:
return Equation(int(ss), [int(x) for x in xs.split()])
case _:
raise ValueError(f"Invalid input: {line}")
return [parse_line(line) for line in lines]
def is_valid(equation, ops=[mul, add]):
def loop(current, xs):
if equation.expected < current:
return False
match xs:
case []:
return current == equation.expected
case [x, *xs]:
return any((loop(op(current, x), xs) for op in ops))
return loop(equation.xs[0], equation.xs[1:])
def part1(equations):
return sum([equation.expected for equation in equations if is_valid(equation)])
def part2(equations):
def concat(x, y):
return int(str(x) + str(y))
return sum([equation.expected for equation in equations if is_valid(equation, ops=[mul, add, concat])])
def main():
equations = parse_input(Path(sys.argv[1]).read_text().splitlines())
print(f"Part 1: {part1(equations)}")
print(f"Part 2: {part2(equations)}")
if __name__ == "__main__":
main()