mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement 2024 day 2
This commit is contained in:
47
2024/src/aoc/days/day2.py
Normal file
47
2024/src/aoc/days/day2.py
Normal file
@@ -0,0 +1,47 @@
|
||||
import numpy
|
||||
|
||||
from . import SeparateRunner
|
||||
|
||||
|
||||
def _safe(nums: numpy.ndarray) -> bool:
|
||||
steps = nums[1:] - nums[:-1]
|
||||
|
||||
if numpy.all(steps > 0):
|
||||
return numpy.all((steps >= 1) & (steps <= 3))
|
||||
elif numpy.all(steps < 0):
|
||||
return numpy.all((steps <= -1) & (steps >= -3))
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def is_safe(line: str) -> bool:
|
||||
nums = numpy.fromstring(line, dtype=numpy.int32, sep=" ")
|
||||
|
||||
return _safe(nums)
|
||||
|
||||
|
||||
def is_savable(line: str) -> bool:
|
||||
nums = numpy.fromstring(line, dtype=numpy.int32, sep=" ")
|
||||
|
||||
return any(
|
||||
_safe(numpy.concatenate((nums[:i], nums[i + 1 :]), axis=None))
|
||||
for i in range(len(nums))
|
||||
)
|
||||
|
||||
|
||||
class DayRunner(SeparateRunner):
|
||||
@classmethod
|
||||
def part1(cls, data: str) -> int:
|
||||
lines = data.strip().split("\n")
|
||||
|
||||
safe = sum(1 for line in lines if is_safe(line))
|
||||
|
||||
return safe
|
||||
|
||||
@classmethod
|
||||
def part2(cls, data: str) -> int:
|
||||
lines = data.strip().split("\n")
|
||||
|
||||
safe = sum(1 for line in lines if is_savable(line))
|
||||
|
||||
return safe
|
||||
Reference in New Issue
Block a user