mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Implement 2024 day 16 part 1
This commit is contained in:
56
2024/src/aoc/days/day16.py
Normal file
56
2024/src/aoc/days/day16.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import heapq
|
||||
|
||||
import numpy
|
||||
|
||||
from . import SeparateRunner
|
||||
|
||||
TURNS = (
|
||||
(-1, 1),
|
||||
(1, -1),
|
||||
)
|
||||
|
||||
|
||||
class DayRunner(SeparateRunner):
|
||||
@classmethod
|
||||
def part1(cls, input: str) -> int:
|
||||
grid = numpy.array([list(line) for line in input.strip().split("\n")])
|
||||
|
||||
y, x = numpy.where(grid == "S")
|
||||
x, y = x[0], y[0]
|
||||
|
||||
todo = [(0, x, y, 1, 0)]
|
||||
best = {
|
||||
(x, y, 1, 0): 0,
|
||||
}
|
||||
|
||||
def enqueue(dist, x, y, dx, dy):
|
||||
if grid[y, x] == "#":
|
||||
return
|
||||
|
||||
if (x, y, dx, dy) not in best or best[x, y, dx, dy] > dist:
|
||||
best[x, y, dx, dy] = dist
|
||||
heapq.heappush(todo, (dist, x, y, dx, dy))
|
||||
|
||||
while todo:
|
||||
dist, x, y, dx, dy = heapq.heappop(todo)
|
||||
|
||||
if best[x, y, dx, dy] < dist:
|
||||
continue
|
||||
|
||||
if grid[y, x] == "E":
|
||||
return dist
|
||||
|
||||
enqueue(dist + 1, x + dx, y + dy, dx, dy)
|
||||
enqueue(dist + 2001, x - dx, y - dy, dx, dy)
|
||||
|
||||
for tx, ty in TURNS:
|
||||
ndx = dy * ty
|
||||
ndy = dx * ty
|
||||
|
||||
enqueue(dist + 1001, x + ndx, y + ndy, ndx, ndy)
|
||||
|
||||
raise ValueError("Did not find path to exit")
|
||||
|
||||
@classmethod
|
||||
def part2(cls, input: str) -> int:
|
||||
pass
|
||||
15
2024/tests/samples/16.1.txt
Normal file
15
2024/tests/samples/16.1.txt
Normal file
@@ -0,0 +1,15 @@
|
||||
###############
|
||||
#.......#....E#
|
||||
#.#.###.#.###.#
|
||||
#.....#.#...#.#
|
||||
#.###.#####.#.#
|
||||
#.#.#.......#.#
|
||||
#.#.#####.###.#
|
||||
#...........#.#
|
||||
###.#.#####.#.#
|
||||
#...#.....#.#.#
|
||||
#.#.#.###.#.#.#
|
||||
#.....#...#.#.#
|
||||
#.###.#.#.#.#.#
|
||||
#S..#.....#...#
|
||||
###############
|
||||
17
2024/tests/samples/16.2.txt
Normal file
17
2024/tests/samples/16.2.txt
Normal file
@@ -0,0 +1,17 @@
|
||||
#################
|
||||
#...#...#...#..E#
|
||||
#.#.#.#.#.#.#.#.#
|
||||
#.#.#.#...#...#.#
|
||||
#.#.#.#.###.#.#.#
|
||||
#...#.#.#.....#.#
|
||||
#.#.#.#.#.#####.#
|
||||
#.#...#.#.#.....#
|
||||
#.#.#####.#.###.#
|
||||
#.#.#.......#...#
|
||||
#.#.###.#####.###
|
||||
#.#.#...#.....#.#
|
||||
#.#.#.#####.###.#
|
||||
#.#.#.........#.#
|
||||
#.#.#.#########.#
|
||||
#S#.............#
|
||||
#################
|
||||
16
2024/tests/test_day16.py
Normal file
16
2024/tests/test_day16.py
Normal file
@@ -0,0 +1,16 @@
|
||||
import pytest
|
||||
|
||||
from aoc.days.day16 import DayRunner
|
||||
|
||||
from . import get_data
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"data,result",
|
||||
[
|
||||
(get_data(16, 1), 7036),
|
||||
(get_data(16, 2), 11048),
|
||||
],
|
||||
)
|
||||
def test_sample_part1(data: str, result: int) -> None:
|
||||
assert DayRunner.part1(data) == result
|
||||
Reference in New Issue
Block a user