2022 in python #4

Open
aey wants to merge 13 commits from 2022-python into main
2 changed files with 64 additions and 0 deletions
Showing only changes of commit 92df810943 - Show all commits

View file

@ -78,6 +78,12 @@ def vdbg(seen, h, w):
print("".join(["#" if (r, c) in seen else " " for c in range(w)]))
def vvdbg(seen, h, w):
"""Print-debug visited positions of a matrix, with values"""
for r in range(h):
print("".join([seen[(r, c)] if (r, c) in seen else "." for c in range(w)]))
def cw(y, x):
"""Flip a (y, x) direction counterwise: U->R, R->D, D->L, L->U.

View file

@ -0,0 +1,58 @@
import re
from collections import deque, Counter, defaultdict
from heapq import heappop, heappush
from itertools import compress, combinations, chain, permutations
from output import matrix, D, DDa, vvdbg, DD, ADJ, ints, mhd, mdbg, vdbg, cw, ccw, bk
def solve(data):
M, H, W = matrix(data)
E = S = None
p1 = p2 = H * W
SP = []
for rr in range(H):
for cc in range(W):
if M[rr][cc] == "E":
E = (rr, cc)
if M[rr][cc] == "S":
S = (rr, cc)
SP.append((rr, cc))
if M[rr][cc] == "a":
SP.append((rr, cc))
M = [list(row) for row in M]
for rc, v in [(S, "a"), (E, "z")]:
r, c = rc
M[r][c] = v
for sp in SP:
Q = [(sp, ord("a"), 0)]
seen = set()
while Q:
yx, e, s = Q.pop(0)
if yx in seen:
continue
seen.add(yx)
if yx == E:
if sp == S:
p1 = s
p2 = min(p2, s)
y, x = yx
for dy, dx in D:
if 0 <= y + dy < H and 0 <= x + dx < W:
n = ord(M[y + dy][x + dx])
if n - e <= 1:
Q.append(((y + dy, x + dx), n, s + 1))
return p1, p2
if __name__ == "__main__":
with open("./input/12.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)
assert p1 == 517
assert p2 == 512