From 657fe956f9079ff99bfc7c1777d7b8e76cc5bd3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20Engl=C3=B6f=20Ytterstr=C3=B6m?= Date: Thu, 27 Nov 2025 22:36:09 +0100 Subject: [PATCH] Solve 2022 day 9 pt 1-2 Pt 1 was just head and tail. For pt 2 I rewrote the code to instead build the rope (snake) from head to tail by always moving the head first and traverse the body of the snake. Yes, I think of it as a body of a snake - not knots on a rope. Child hood memories are to damn colorful :) For reference, this is my visually debugging code: def dbg(seen, snake): print(snake) for r in range(-4, 1): print("".join([v(r, c, snake) for c in range(0, 7)])) print("") def v(r, c, snake): if (r,c) == snake[0]: return "H" for i, n in enumerate(snake[1:-1], start=1): if (r,c) == n: return str(i) if (r,c) == snake[-1]: return "T" if (r,c) == (0,0): return "s" return "." --- 2022-python/output/day_09.py | 71 ++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 2022-python/output/day_09.py diff --git a/2022-python/output/day_09.py b/2022-python/output/day_09.py new file mode 100644 index 0000000..2c1e2b7 --- /dev/null +++ b/2022-python/output/day_09.py @@ -0,0 +1,71 @@ +from output import DD, ints + + +def solve(data): + p12 = [] + for sl in [2, 10]: + seen = set([(0, 0)]) + snake = [(0, 0)] * sl + for line in data.splitlines(): + d = line[0] + for i in range(ints(line)[0]): + ns = [] + hd, *tls = snake + r, c = hd + hd = r + DD[d][0], c + DD[d][1] + ns.append(hd) + for tl in tls: + r, c = tl + match (r - hd[0], c - hd[1]): + case (2, -1): + tl = r - 1, c + 1 + case (-2, -1): + tl = r + 1, c + 1 + case (-2, 1): + tl = r + 1, c - 1 + case (2, 1): + tl = r - 1, c - 1 + case (1, 2): + tl = r - 1, c - 1 + case (-1, 2): + tl = r + 1, c - 1 + case (-1, -2): + tl = r + 1, c + 1 + case (1, -2): + tl = r - 1, c + 1 + case (0, 2): + tl = r, c - 1 + case (0, -2): + tl = r, c + 1 + case (2, 0): + tl = r - 1, c + case (-2, 0): + tl = r + 1, c + case (2, -2): + tl = r - 1, c + 1 + case (-2, -2): + tl = r + 1, c + 1 + case (-2, 2): + tl = r + 1, c - 1 + case (2, 2): + tl = r - 1, c - 1 + ns.append(tl) + hd = tl + snake = ns + seen.add(tl) + p12.append(len(seen)) + p1, p2 = p12 + return p1, p2 + + +if __name__ == "__main__": + with open("./input/09.txt", "r") as f: + inp = f.read().strip() + + p1, p2 = solve(inp) + + print(p1) + print(p2) + + assert p1 == 6212 + assert p2 == 2522