Skip to content

Commit 3da786c

Browse files
authored
2025-2-2 (#22)
1 parent cf1fc8d commit 3da786c

File tree

2 files changed

+82
-14
lines changed

2 files changed

+82
-14
lines changed

src/advent_of_code/year_2025/day_02.py

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from advent_of_code.utils.input_handling import read_input
22

3+
VALID_PARTS = (1,2)
34

45
def parse_input(raw):
56
raw_split = raw[0].split(",")
@@ -24,41 +25,62 @@ def check_id_valid(id):
2425
else:
2526
return True
2627

27-
28-
def get_invalid_ids_in_range(range_pair):
28+
def check_id_valid_v2(id):
29+
id_len = len(str(id))
30+
half_len = id_len // 2
31+
for sub_str_len in range(1,half_len+1):
32+
sub_str = id[:sub_str_len]
33+
str_to_search = id[sub_str_len:]
34+
if (len(str_to_search) % sub_str_len == 0): # substr divisible by search str length
35+
if (sub_str * (id_len // sub_str_len) == id): # substr matches N * search string
36+
return False
37+
return True
38+
39+
def get_invalid_ids_in_range(range_pair, part):
2940
full_range = range(range_pair[0], range_pair[1] + 1)
41+
42+
if part == 1:
43+
id_checker_function = check_id_valid
44+
elif part == 2:
45+
id_checker_function = check_id_valid_v2
46+
else:
47+
raise ValueError("Specify a valid part number")
48+
3049
invalid_ids = []
3150
for x in full_range:
32-
if not check_id_valid(str(x)):
51+
if not id_checker_function(str(x)):
3352
invalid_ids.append(x)
3453
return invalid_ids
3554

3655

37-
def find_invalid_ids_in_range_string(range_string):
56+
def find_invalid_ids_in_range_string(range_string, part):
3857
range_pair_as_ints = convert_range_string_to_pair(range_string)
39-
invalid_ids_in_range = get_invalid_ids_in_range(range_pair_as_ints)
58+
invalid_ids_in_range = get_invalid_ids_in_range(range_pair_as_ints, part)
4059
return invalid_ids_in_range
4160

4261

43-
def find_all_invalid_ids(parsed_input):
62+
def find_all_invalid_ids(parsed_input, part):
4463
invalid_ids = []
4564
for range_pair in parsed_input:
46-
invalid_ids.extend(find_invalid_ids_in_range_string(range_pair))
65+
invalid_ids.extend(find_invalid_ids_in_range_string(range_pair, part))
4766
return invalid_ids
4867

4968

5069
def sum_invalid_ids(invalid_ids):
5170
return sum(invalid_ids)
5271

5372

54-
def solve_part_1(parsed_input):
55-
invalid_ids = find_all_invalid_ids(parsed_input)
73+
def solve_part(parsed_input, part):
74+
invalid_ids = find_all_invalid_ids(parsed_input, part)
5675
return sum_invalid_ids(invalid_ids)
5776

77+
def solve_part_2(parsed_input):
78+
invalid_ids = find_all_invalid_ids(parsed_input)
79+
return sum_invalid_ids(invalid_ids)
5880

5981
def solve(parsed_input):
60-
part_1_solution = solve_part_1(parsed_input)
61-
part_2_solution = None
82+
part_1_solution = solve_part(parsed_input, part=1)
83+
part_2_solution = solve_part(parsed_input, part=2)
6284
return (part_1_solution, part_2_solution)
6385

6486

tests/year_2025/test_day_02.py

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from advent_of_code.year_2025.day_02 import (
44
check_id_valid,
5+
check_id_valid_v2,
56
convert_range_string_to_pair,
67
find_invalid_ids_in_range_string,
78
parse_input,
@@ -17,7 +18,7 @@
1718
[
1819
"11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124" # noqa: E501
1920
],
20-
(1227775554, None),
21+
(1227775554, 4174379265),
2122
],
2223
],
2324
)
@@ -28,6 +29,36 @@ def test_solver(input, expected_output):
2829
result = solve(input_parsed)
2930
assert result == expected_output
3031

32+
# 11-22 still has two invalid IDs, 11 and 22.
33+
# 95-115 now has two invalid IDs, 99 and 111.
34+
# 998-1012 now has two invalid IDs, 999 and 1010.
35+
# 1188511880-1188511890 still has one invalid ID, 1188511885.
36+
# 222220-222224 still has one invalid ID, 222222.
37+
# 1698522-1698528 still contains no invalid IDs.
38+
# 446443-446449 still has one invalid ID, 446446.
39+
# 38593856-38593862 still has one invalid ID, 38593859.
40+
# 565653-565659 now has one invalid ID, 565656.
41+
# 824824821-824824827 now has one invalid ID, 824824824.
42+
# 2121212118-2121212124 now has one invalid ID, 2121212121.
43+
44+
@pytest.mark.parametrize(
45+
"input, expected_invalid_ids",
46+
[
47+
["11-22", [11, 22]],
48+
["95-115", [99, 111]],
49+
["998-1012", [999, 1010]],
50+
["1188511880-1188511890", [1188511885]],
51+
["222220-222224", [222222]],
52+
["1698522-1698528", []],
53+
["446443-446449", [446446]],
54+
["38593856-38593862", [38593859]],
55+
["565653-565659", [565656]],
56+
["824824821-824824827", [824824824]],
57+
["2121212118-2121212124", [2121212121]],
58+
],
59+
)
60+
def test_find_invalid_ids_in_range_string_part_2(input, expected_invalid_ids):
61+
assert expected_invalid_ids == find_invalid_ids_in_range_string(input, part=2)
3162

3263
@pytest.mark.parametrize(
3364
"input, expected_invalid_ids",
@@ -46,7 +77,7 @@ def test_solver(input, expected_output):
4677
],
4778
)
4879
def test_find_invalid_ids_in_range_string(input, expected_invalid_ids):
49-
assert expected_invalid_ids == find_invalid_ids_in_range_string(input)
80+
assert expected_invalid_ids == find_invalid_ids_in_range_string(input, part=1)
5081

5182

5283
@pytest.mark.parametrize(
@@ -74,7 +105,22 @@ def test_convert_range_string_to_pair(input, expected_pair):
74105

75106
@pytest.mark.parametrize(
76107
"input, is_valid",
77-
[("11", False), ("12", True), ("22", False), ("998", True), ("1010", False)],
108+
[("11", False), ("12", True), ("22", False), ("998", True), ("999", True), ("1010", False), ("565656", True)],
78109
)
79110
def test_check_id_valid(input, is_valid):
80111
assert is_valid == check_id_valid(input)
112+
113+
@pytest.mark.parametrize(
114+
"input, is_valid",
115+
[
116+
("11", False),
117+
("12", True),
118+
("22", False),
119+
("998", True),
120+
("999", False),
121+
("1010", False),
122+
("565656", False),
123+
],
124+
)
125+
def test_check_id_valid_v2(input, is_valid):
126+
assert is_valid == check_id_valid_v2(input)

0 commit comments

Comments
 (0)