Skip to content

Commit

Permalink
Day 18: Python (part 1)
Browse files Browse the repository at this point in the history
Test doesn't work on the example: n=7 (the actual grid size) outputs a
path length of 18 instead of 22. Must set n=9 to obtain the correct
result.
  • Loading branch information
edoardob90 committed Dec 22, 2024
1 parent f2a1717 commit 5729a46
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 0 deletions.
56 changes: 56 additions & 0 deletions 18/python/solution.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#!/usr/bin/env python3
"""AoC day 18, 2024: RAM Run"""

import pathlib
import sys
from collections import deque

from utils import ilist


def parse_data(puzzle_input: str) -> list[list[int]]:
"""Parse input data"""
return [ilist(line, sep=",") for line in puzzle_input.splitlines()]


def part1(data: list[list[int]], n: int = 70, bytes: int = 1024) -> int:
"""Solve part 1"""
grid = [[0] * (n + 1) for _ in range(n + 1)]
for col, row in data[:bytes]:
grid[row][col] = 1

queue = deque([(0, 0, 0)])
seen = {(0, 0)}

while queue:
row, col, distance = queue.popleft()
for nr, nc in ((row + 1, col), (row, col + 1), (row - 1, col), (row, col - 1)):
if nr < 0 or nc < 0 or nr > n or nc > n:
continue
if (nr, nc) in seen:
continue
if grid[nr][nc] == 1:
continue
if nr == nc == n:
return distance + 1
seen.add((nr, nc))
queue.append((nr, nc, distance + 1))
return 0


def part2(data: list[list[int]]) -> int:
"""Solve part 2"""
return 0


def solve(puzzle_input: str) -> tuple[int, int]:
"""Solve the puzzle for the given input"""
data = parse_data(puzzle_input)
return part1(data), part2(data)


if __name__ == "__main__":
for path in sys.argv[1:]:
print(f"\n{path}:")
solutions = solve(pathlib.Path(path).read_text().strip())
print("\n".join(str(solution) for solution in solutions))
34 changes: 34 additions & 0 deletions 18/python/test_solution.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#!/usr/bin/env python3
"""Tests for AoC day 18, 2024: RAM Run"""

from pathlib import Path

import pytest

from solution import parse_data, part1, part2


@pytest.fixture
def example_data() -> str:
current_dir = Path(__file__).parent
filename = current_dir.parent / "example.txt"
try:
return filename.read_text().strip()
except FileNotFoundError:
raise FileNotFoundError(f"Example input file not found at {filename}")


def test_parse(example_data: str) -> None:
data = parse_data(example_data)
assert len(data) > 0


def test_part1(example_data: str) -> None:
data = parse_data(example_data)
# FIXME: `n` is wrong for the example, it doesn't match the grid size
assert part1(data, n=9, bytes=12) == 22


def test_part2(example_data: str) -> None:
data = parse_data(example_data)
assert part2(data) == 0 # FIXME: replace with expected result for Part 2

0 comments on commit 5729a46

Please sign in to comment.