from typing import Any def _find_max_subnumber(numbers: list[int], length: int) -> int: if length > len(numbers): raise ValueError("length greater than numbers length") remove = len(numbers) - length stack = [] for n in numbers: while remove and stack and stack[-1] < n: stack.pop() remove -= 1 stack.append(n) res = 0 for digit in stack[:length]: res = res * 10 + digit return res def _parse_input(input_data: str) -> list[list[int]]: return [list(map(int, line)) for line in input_data.splitlines()] def part_1(input_data: str) -> Any: return sum(_find_max_subnumber(p, 2) for p in _parse_input(input_data)) def part_2(input_data: str) -> Any: return sum(_find_max_subnumber(p, 12) for p in _parse_input(input_data)) def test_find_max_subnumber(): assert _find_max_subnumber([1, 2, 3, 4, 9], 2) == 49 assert _find_max_subnumber([1, 2, 3, 4, 5], 2) == 45 assert _find_max_subnumber([5, 4, 3, 2, 1], 2) == 54 assert _find_max_subnumber([1, 3, 5, 2, 4], 2) == 54 assert _find_max_subnumber([8, 1, 8, 2, 7, 3], 3) == 887 assert _find_max_subnumber([1, 9, 2, 8, 3, 7], 3) == 987 assert _find_max_subnumber([1, 2, 3, 4, 5], 3) == 345 def test_part_1(example_data): assert part_1(example_data) == 357 def test_part_2(example_data): assert part_2(example_data) == 3121910778619