Clean day 12.

This commit is contained in:
Mikael CAPELLE 2022-12-12 17:55:24 +01:00
parent c55f6ac8e1
commit c7ef505f1b

View File

@ -82,6 +82,33 @@ def print_path(path: list[tuple[int, int]], n_rows: int, n_cols: int) -> None:
print("\n".join("".join(row) for row in graph)) print("\n".join("".join(row) for row in graph))
def neighbors(
grid: list[list[int]], node: tuple[int, int], up: bool
) -> Iterator[tuple[int, int]]:
n_rows = len(grid)
n_cols = len(grid[0])
c_row, c_col = node
for n_row, n_col in (
(c_row - 1, c_col),
(c_row + 1, c_col),
(c_row, c_col - 1),
(c_row, c_col + 1),
):
if not (n_row >= 0 and n_row < n_rows and n_col >= 0 and n_col < n_cols):
continue
if up and grid[n_row][n_col] > grid[c_row][c_col] + 1:
continue
elif not up and grid[n_row][n_col] < grid[c_row][c_col] - 1:
continue
yield n_row, n_col
# === main code ===
lines = sys.stdin.read().splitlines() lines = sys.stdin.read().splitlines()
grid = [[ord(cell) - ord("a") for cell in line] for line in lines] grid = [[ord(cell) - ord("a") for cell in line] for line in lines]
@ -106,47 +133,19 @@ for i_row, row in enumerate(grid):
grid[start[0]][start[1]] = 0 grid[start[0]][start[1]] = 0
grid[end[0]][end[1]] = ord("z") - ord("a") grid[end[0]][end[1]] = ord("z") - ord("a")
n_rows = len(grid)
n_cols = len(grid[0])
def heuristic(lhs: tuple[int, int], rhs: tuple[int, int]) -> float:
return abs(lhs[0] - rhs[0]) + abs(lhs[1] - rhs[1])
def neighbors(node: tuple[int, int], up: bool) -> Iterator[tuple[int, int]]:
c_row, c_col = node
for n_row, n_col in (
(c_row - 1, c_col),
(c_row + 1, c_col),
(c_row, c_col - 1),
(c_row, c_col + 1),
):
if not (n_row >= 0 and n_row < n_rows and n_col >= 0 and n_col < n_cols):
continue
if up and grid[n_row][n_col] > grid[c_row][c_col] + 1:
continue
elif not up and grid[n_row][n_col] < grid[c_row][c_col] - 1:
continue
yield n_row, n_col
lengths_1, parents_1 = dijkstra( lengths_1, parents_1 = dijkstra(
start=start, neighbors=lambda n: neighbors(n, True), cost=lambda lhs, rhs: 1 start=start, neighbors=lambda n: neighbors(grid, n, True), cost=lambda lhs, rhs: 1
) )
path_1 = make_path(parents_1, start, end) path_1 = make_path(parents_1, start, end)
assert path_1 is not None assert path_1 is not None
print_path(path_1, n_rows=len(grid), n_cols=len(grid[0])) print_path(path_1, n_rows=len(grid), n_cols=len(grid[0]))
answer_1 = lengths_1[end] - 1 print(f"answer 1 is {lengths_1[end] - 1}")
print(f"answer 1 is {answer_1}")
lengths_2, parents_2 = dijkstra( lengths_2, parents_2 = dijkstra(
start=end, neighbors=lambda n: neighbors(n, False), cost=lambda lhs, rhs: 1 start=end, neighbors=lambda n: neighbors(grid, n, False), cost=lambda lhs, rhs: 1
) )
answer_2 = min(lengths_2.get(start, float("inf")) for start in start_s) answer_2 = min(lengths_2.get(start, float("inf")) for start in start_s)
print(f"answer 2 is {answer_2}") print(f"answer 2 is {answer_2}")