From 00000050d960a20d60d69ba54cdadf41d17bf1ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Jane=C5=BEi=C4=8D?= Date: Tue, 2 Dec 2025 06:42:42 +0100 Subject: [PATCH] feat: add solution 2025/02 --- data/example/2025/02.txt | 1 + src/solution/year_2025/day_02.py | 79 ++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 data/example/2025/02.txt create mode 100644 src/solution/year_2025/day_02.py diff --git a/data/example/2025/02.txt b/data/example/2025/02.txt new file mode 100644 index 000000000..a3f22ef --- /dev/null +++ b/data/example/2025/02.txt @@ -0,0 +1 @@ +11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124 diff --git a/src/solution/year_2025/day_02.py b/src/solution/year_2025/day_02.py new file mode 100644 index 000000000..5aa0309 --- /dev/null +++ b/src/solution/year_2025/day_02.py @@ -0,0 +1,79 @@ +import math +from typing import Any + + +def _cut_right_n_digits(s: int, n: int) -> tuple[int, int]: + left = s // 10**n + right = s - left * 10**n + return left, right + + +def is_invalid(n: int) -> bool: + size = int(math.log10(n)) + 1 + left, right = _cut_right_n_digits(n, size // 2) + return left == right + + +def is_invalid_any(n: int) -> bool: + size = int(math.log10(n)) + 1 + + for cut in range(1, size): + if size % cut != 0: + continue + + left, right = _cut_right_n_digits(n, cut) + while left != 0: + nleft, nright = _cut_right_n_digits(left, cut) + if nright != right: + break + left = nleft + + if left == 0: + return True + + return False + + +def part_1(input_data: str) -> Any: + s = 0 + for rng in input_data.split(","): + a, b = (int(s) for s in rng.split("-")) + s += sum([n for n in range(a, b + 1) if is_invalid(n)]) + + return s + + +def part_2(input_data: str) -> Any: + s = 0 + for rng in input_data.split(","): + a, b = (int(s) for s in rng.split("-")) + s += sum([n for n in range(a, b + 1) if is_invalid_any(n)]) + + return s + + +def test_is_invalid(): + assert is_invalid(55) + assert is_invalid(6464) + assert is_invalid(123123) + + assert not is_invalid(123124) + assert not is_invalid(22222) + + +def test_is_invalid_any(): + assert is_invalid_any(12341234) + assert is_invalid_any(123123123) + assert is_invalid_any(12121212) + assert is_invalid_any(1111111) + + assert not is_invalid_any(123124) + assert not is_invalid_any(12312) + + +def test_part_1(example_data): + assert part_1(example_data) == 1227775554 + + +def test_part_2(example_data): + assert part_2(example_data) == 4174379265