From 0bffcaf23f5be80f6644b7514b0cb50f56e2d392 Mon Sep 17 00:00:00 2001 From: James Lawlor Date: Sun, 7 Dec 2025 13:15:43 +0200 Subject: [PATCH] y2025 d2 part 1 --- inputs/year_2025/02.dat | 1 + src/advent_of_code/year_2025/day_02.py | 77 +++++++++++++++++++++++++ tests/year_2025/test_day_02.py | 80 ++++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 inputs/year_2025/02.dat create mode 100644 src/advent_of_code/year_2025/day_02.py create mode 100644 tests/year_2025/test_day_02.py diff --git a/inputs/year_2025/02.dat b/inputs/year_2025/02.dat new file mode 100644 index 0000000..c2d817f --- /dev/null +++ b/inputs/year_2025/02.dat @@ -0,0 +1 @@ +52500467-52574194,655624494-655688785,551225-576932,8418349387-8418411293,678-1464,33-79,74691-118637,8787869169-8787890635,9898977468-9899009083,548472423-548598890,337245835-337375280,482823-543075,926266-991539,1642682920-1642753675,3834997-3940764,1519-2653,39697698-39890329,3-21,3251796-3429874,3467-9298,26220798-26290827,80-124,200638-280634,666386-710754,21329-64315,250-528,9202893-9264498,819775-903385,292490-356024,22-32,2663033-2791382,133-239,56514707-56704320,432810-458773,4949427889-4949576808 \ No newline at end of file diff --git a/src/advent_of_code/year_2025/day_02.py b/src/advent_of_code/year_2025/day_02.py new file mode 100644 index 0000000..c00c3fd --- /dev/null +++ b/src/advent_of_code/year_2025/day_02.py @@ -0,0 +1,77 @@ +from advent_of_code.utils.input_handling import read_input + + +def parse_input(raw): + raw_split = raw[0].split(",") + return raw_split + + +def convert_range_string_to_pair(range_string): + range_split = range_string.split("-") + return (int(range_split[0]), int(range_split[1])) + + +def split_id(id): + id_len = len(str(id)) + half_len = id_len // 2 + return (id[:half_len], id[half_len:]) + + +def check_id_valid(id): + (id_part_1, id_part_2) = split_id(id) + if id_part_1 == id_part_2: + return False + else: + return True + + +def get_invalid_ids_in_range(range_pair): + full_range = range(range_pair[0], range_pair[1] + 1) + invalid_ids = [] + for x in full_range: + if not check_id_valid(str(x)): + invalid_ids.append(x) + return invalid_ids + + +def find_invalid_ids_in_range_string(range_string): + range_pair_as_ints = convert_range_string_to_pair(range_string) + invalid_ids_in_range = get_invalid_ids_in_range(range_pair_as_ints) + return invalid_ids_in_range + + +def find_all_invalid_ids(parsed_input): + invalid_ids = [] + for range_pair in parsed_input: + invalid_ids.extend(find_invalid_ids_in_range_string(range_pair)) + return invalid_ids + + +def sum_invalid_ids(invalid_ids): + return sum(invalid_ids) + + +def solve_part_1(parsed_input): + invalid_ids = find_all_invalid_ids(parsed_input) + return sum_invalid_ids(invalid_ids) + + +def solve(parsed_input): + part_1_solution = solve_part_1(parsed_input) + part_2_solution = None + return (part_1_solution, part_2_solution) + + +def main(input_file): + input = read_input(input_file) + parsed_input = parse_input(input) + (result_part_1, result_part_2) = solve(parsed_input) + print( + f"Day 01 \n" + f" Result for part 1 is {result_part_1} \n" + f" Result for part 2 is {result_part_2} \n" + ) + + +if __name__ == "__main__": + main() diff --git a/tests/year_2025/test_day_02.py b/tests/year_2025/test_day_02.py new file mode 100644 index 0000000..0bedd41 --- /dev/null +++ b/tests/year_2025/test_day_02.py @@ -0,0 +1,80 @@ +import pytest + +from advent_of_code.year_2025.day_02 import ( + check_id_valid, + convert_range_string_to_pair, + find_invalid_ids_in_range_string, + parse_input, + solve, + sum_invalid_ids, +) + + +@pytest.mark.parametrize( + "input, expected_output", + [ + [ + [ + "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124" # noqa: E501 + ], + (1227775554, None), + ], + ], +) +def test_solver(input, expected_output): + print(f"day_02_test_input:{input}") + input_parsed = parse_input(input) + print(f"input_parsed:{input_parsed}") + result = solve(input_parsed) + assert result == expected_output + + +@pytest.mark.parametrize( + "input, expected_invalid_ids", + [ + ["11-22", [11, 22]], + ["95-115", [99]], + ["998-1012", [1010]], + ["1188511880-1188511890", [1188511885]], + ["222220-222224", [222222]], + ["1698522-1698528", []], + ["446443-446449", [446446]], + ["38593856-38593862", [38593859]], + ["565653-565659", []], + ["824824821-824824827", []], + ["2121212118-2121212124", []], + ], +) +def test_find_invalid_ids_in_range_string(input, expected_invalid_ids): + assert expected_invalid_ids == find_invalid_ids_in_range_string(input) + + +@pytest.mark.parametrize( + "input, expected_output", + [ + ([1, 2, 3], 6), + ], +) +def test_sum_invalid_ids(input, expected_output): + assert expected_output == sum_invalid_ids(input) + + +@pytest.mark.parametrize( + "input, expected_pair", + [ + ("11-22", (11, 22)), + ("95-115", (95, 115)), + ("998-1012", (998, 1012)), + ("1188511880-1188511890", (1188511880, 1188511890)), + ], +) +def test_convert_range_string_to_pair(input, expected_pair): + assert expected_pair == convert_range_string_to_pair(input) + + +@pytest.mark.parametrize( + "input, is_valid", + [("11", False), ("12", True), ("22", False), ("998", True), ("1010", False)], +) +def test_check_id_valid(input, is_valid): + assert is_valid == check_id_valid(input)