2024-12-08 13:06:41 +00:00
|
|
|
from typing import Any, Iterator
|
2024-12-01 09:26:02 +00:00
|
|
|
|
2024-12-08 13:06:41 +00:00
|
|
|
from ..base import BaseSolver
|
2024-12-01 09:26:02 +00:00
|
|
|
|
|
|
|
|
2024-12-08 13:06:41 +00:00
|
|
|
class Solver(BaseSolver):
|
|
|
|
def solve(self, input: str) -> Iterator[Any]:
|
|
|
|
def is_safe(level: list[int]) -> bool:
|
|
|
|
diff = [a - b for a, b in zip(level[:-1], level[1:], strict=True)]
|
2024-12-02 07:59:07 +00:00
|
|
|
|
2024-12-08 13:06:41 +00:00
|
|
|
return sum(d > 0 for d in diff) in (0, len(diff)) and all(
|
|
|
|
1 <= abs(d) <= 3 for d in diff
|
|
|
|
)
|
2024-12-02 07:59:07 +00:00
|
|
|
|
2024-12-08 13:06:41 +00:00
|
|
|
def is_any_safe(level: list[int]) -> bool:
|
|
|
|
return any(
|
|
|
|
is_safe(level[:i] + level[i + 1 :]) for i in range(0, len(level))
|
|
|
|
)
|
2024-12-02 07:59:07 +00:00
|
|
|
|
2024-12-08 13:06:41 +00:00
|
|
|
levels = [[int(c) for c in r.split()] for r in input.splitlines()]
|
2024-12-02 07:59:07 +00:00
|
|
|
|
2024-12-08 13:06:41 +00:00
|
|
|
yield sum(is_safe(level) for level in levels)
|
|
|
|
yield sum(is_safe(level) or is_any_safe(level) for level in levels)
|