From 92df810943b637bd612abbf1cea5291c3249e326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Engl=C3=B6f=20Ytterstr=C3=B6m?= Date: Sun, 30 Nov 2025 18:48:52 +0100 Subject: [PATCH] Solve 2022 day 12 pt 1-2 BFS, baby. 2 things got me. * S position was not (0,0) in the puzzle input. Such embarrasment to loose time over something so stupid. * I asumed the elevation was fixed to to increase AND DECREASE by 1. From the problem description: > To avoid needing to get out your climbing gear, the elevation of the > destination square can be at most one higher than the elevation of > your current square; that is, if your current elevation is m, you > could step to elevation n, but not to elevation o. _(This also means > that the elevation of the destination square can be much lower than > the elevation of your current square.)_ This means elevation only can _increase_ by one, but _decrease_ with more. So my wrong code: 0 <= abs(n - e) <= 1 got fixed with: n - e <= 1 For pt 2, I reused the loop to find S to collect all "a" positions, and looped them as starting points. Execution time is not the best, but it works. --- 2022-python/output/__init__.py | 6 ++++ 2022-python/output/day_12.py | 58 ++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 2022-python/output/day_12.py diff --git a/2022-python/output/__init__.py b/2022-python/output/__init__.py index ba3186c..809c3f5 100644 --- a/2022-python/output/__init__.py +++ b/2022-python/output/__init__.py @@ -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. diff --git a/2022-python/output/day_12.py b/2022-python/output/day_12.py new file mode 100644 index 0000000..cb6d27a --- /dev/null +++ b/2022-python/output/day_12.py @@ -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