feat: add solution 2025/02
This commit is contained in:
1
data/example/2025/02.txt
Normal file
1
data/example/2025/02.txt
Normal file
@@ -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
|
||||||
79
src/solution/year_2025/day_02.py
Normal file
79
src/solution/year_2025/day_02.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user