-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday2.py
More file actions
69 lines (50 loc) · 1.6 KB
/
day2.py
File metadata and controls
69 lines (50 loc) · 1.6 KB
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Advent of Code 2025, Day 2
# (c) blu3r4y
from aocd.models import Puzzle
from funcy import print_calls, print_durations
@print_calls
@print_durations(unit="ms")
def part1(ranges):
invalid_ids = set()
for start, end in ranges:
for i in range(start, end + 1):
if is_invalid_id(i, n_repeat=2):
invalid_ids.add(i)
return sum(invalid_ids)
@print_calls
@print_durations(unit="ms")
def part2(ranges):
invalid_ids = set()
for start, end in ranges:
for i in range(start, end + 1):
num_digits = len(str(i))
for j in range(2, num_digits + 1):
if is_invalid_id(i, n_repeat=j):
invalid_ids.add(i)
return sum(invalid_ids)
def is_invalid_id(i, n_repeat=2):
# split into digits and check if divisible
digits = [int(d) for d in str(i)]
if len(digits) % n_repeat != 0:
return False
# test all offsets (e.g., for 1212 check index 0,2 and 1,3)
offset = len(digits) // n_repeat
for j in range(offset):
for k in range(1, n_repeat):
if digits[j] != digits[j + k * offset]:
return False
return True
def load(data):
ranges = []
for chunk in data.strip().split(","):
start, end = chunk.split("-")
ranges.append((int(start), int(end)))
return ranges
if __name__ == "__main__":
puzzle = Puzzle(year=2025, day=2)
ans1 = part1(load(puzzle.input_data))
assert ans1 == 37314786486
puzzle.answer_a = ans1
ans2 = part2(load(puzzle.input_data))
assert ans2 == 47477053982
puzzle.answer_b = ans2