This commit is contained in:
Stefan Harmuth 2024-12-18 07:38:30 +01:00
parent 71c3c765da
commit 51666c7857
3 changed files with 3547 additions and 0 deletions

72
day18.py Normal file
View File

@ -0,0 +1,72 @@
from heapq import heappush, heappop
from tools.aoc import AOCDay
from tools.coordinate import Coordinate, DistanceAlgorithm
from tools.grid import Grid
from typing import Any
def get_path(memory: Grid) -> set[Coordinate]:
queue = [(0, 0, Coordinate(0, 0), set())]
target = Coordinate(memory.maxX, memory.maxY)
visited = set()
while queue:
_, cost, pos, path = heappop(queue)
if pos == target:
return path
if pos in visited:
continue
visited.add(pos)
for n in memory.getNeighboursOf(pos, includeDiagonal=False, includeDefault=True):
if memory.get(n):
continue
target_dist = n.getDistanceTo(target, algorithm=DistanceAlgorithm.MANHATTAN, includeDiagonals=False)
heappush(queue, (cost + target_dist, cost + 1, n, path | {n}))
return set()
class Day(AOCDay):
inputs = [
[
(22, "input18_test"),
(248, "input18"),
],
[
("6,1", "input18_test"),
("32,55", "input18"),
],
]
def parse_input(self) -> tuple[int, Grid, list[Coordinate]]:
memory = Grid()
memory.maxX = 70 if not self.is_test() else 6
memory.maxY = 70 if not self.is_test() else 6
falling_bytes = [Coordinate(x, y) for x, y in self.getIntsFromInput()]
steps = 1024 if not self.is_test() else 12
for i in range(steps):
memory.set(falling_bytes[i])
return steps, memory, falling_bytes
def part1(self) -> Any:
_, memory, falling_bytes = self.parse_input()
return len(get_path(memory))
def part2(self) -> Any:
steps, memory, falling_bytes = self.parse_input()
path = get_path(memory)
for i in range(steps + 1, len(falling_bytes)):
memory.set(falling_bytes[i])
if falling_bytes[i] not in path:
continue
path = get_path(memory)
if not path:
return str(falling_bytes[i])[1:-1]
if __name__ == "__main__":
day = Day(2024, 18)
day.run(verbose=True)

3450
inputs/input18 Normal file

File diff suppressed because it is too large Load Diff

25
inputs/input18_test Normal file
View File

@ -0,0 +1,25 @@
5,4
4,2
4,5
3,0
2,1
6,3
2,4
1,5
0,6
3,3
2,6
5,1
1,2
5,5
2,5
6,5
1,4
0,4
6,4
1,1
6,1
1,0
0,5
1,6
2,0