-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathday3.py
43 lines (27 loc) · 1.21 KB
/
day3.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
import re
from day_base import Day
def evaluate_memory(memory):
regex = re.compile(r'mul\((\d+),(\d+)\)')
matches = re.findall(regex, memory)
return sum(int(i1) * int(i2) for (i1, i2) in matches)
class Day3(Day):
def __init__(self):
super().__init__(2024, 3, 'Mull It Over', expected_a=161, expected_b=48, debug=False)
def part_a(self):
return evaluate_memory(''.join(self.input))
def part_a_oneliner(self) -> int:
return sum(int(i1) * int(i2) for (i1, i2) in re.findall(r'mul\((\d+),(\d+)\)', ''.join(self.input)))
def part_b(self) -> int:
memory = ''.join(self.input)
# Use the non-greedy Kleene star operator
dont_pattern = re.compile(r"don't\(\).*?do\(\)")
cleaned_memory = ''.join(re.split(dont_pattern, memory))
# There might be a trailing don't
suffix = re.match(r"don't\(\).*", cleaned_memory)
if suffix:
cleaned_memory = cleaned_memory.removesuffix(suffix.group())
return evaluate_memory(''.join(cleaned_memory))
def part_b_oneliner(self) -> int:
return evaluate_memory(''.join(re.split(r"don't\(\).*?do\(\)", ''.join(self.input))))
if __name__ == '__main__':
(Day3()).run()