Skip to content

Commit

Permalink
Implement 2024 day 16 part 1
Browse files Browse the repository at this point in the history
  • Loading branch information
bertptrs committed Dec 16, 2024
1 parent da7ee96 commit f0556c6
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 0 deletions.
56 changes: 56 additions & 0 deletions 2024/src/aoc/days/day16.py
Original file line number Diff line number Diff line change
@@ -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 changes: 15 additions & 0 deletions 2024/tests/samples/16.1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
###############
#.......#....E#
#.#.###.#.###.#
#.....#.#...#.#
#.###.#####.#.#
#.#.#.......#.#
#.#.#####.###.#
#...........#.#
###.#.#####.#.#
#...#.....#.#.#
#.#.#.###.#.#.#
#.....#...#.#.#
#.###.#.#.#.#.#
#S..#.....#...#
###############
17 changes: 17 additions & 0 deletions 2024/tests/samples/16.2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#################
#...#...#...#..E#
#.#.#.#.#.#.#.#.#
#.#.#.#...#...#.#
#.#.#.#.###.#.#.#
#...#.#.#.....#.#
#.#.#.#.#.#####.#
#.#...#.#.#.....#
#.#.#####.#.###.#
#.#.#.......#...#
#.#.###.#####.###
#.#.#...#.....#.#
#.#.#.#####.###.#
#.#.#.........#.#
#.#.#.#########.#
#S#.............#
#################
16 changes: 16 additions & 0 deletions 2024/tests/test_day16.py
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit f0556c6

Please sign in to comment.