diff --git a/2025-python/output/__init__.py b/2025-python/output/__init__.py index c1861ff..8c26c52 100644 --- a/2025-python/output/__init__.py +++ b/2025-python/output/__init__.py @@ -1,5 +1,6 @@ import re from math import inf +from PIL import Image # Directions/Adjacents for 2D matrices, in the order UP, RIGHT, DOWN, LEFT D = [ @@ -90,15 +91,47 @@ def vdbg(seen, mask=("#", "."), M=None): r = max(r, x) b = max(b, y) l = min(l, x) - H = b - t + 1 - W = r - l + 1 - osr = t - osc = l + H = b + 1 + W = r + 1 + osr = 0 #t + osc = 0 #l C, Z = mask def _m(r, c): return M[r][c] if M else Z + O = [] for r in range(H): - print("".join([C if (r + osr, c + osc) in seen else _m(r, c) for c in range(W)])) + O.append("".join([C if (r + osr, c + osc) in seen else _m(r, c) for c in range(W)])) + print("\n".join(O)) + + +def svg(seen): + """Print-debug visited positions of a matrix""" + t = inf + l = inf + b = 0 + r = 0 + rects = [] + for y, x in seen: + t = min(t, y) + r = max(r, x) + b = max(b, y) + l = min(l, x) + H = b - t + 1 + W = r - l + 1 + print(t, r, b, l) + im = Image.new(mode="RGB", size=(W,H), color=(255,255,255)) + for y, x in seen: + im.putpixel((x-l, y-t), (0, 0, 0, 255)) + im.save("aoc.png") + + for y, x in seen: + rects.append(f"") + with open("svg.svg", "w") as f: + f.write(f""" + + {"".join(rects)} + + """.strip()) def vvdbg(seen, h, w): diff --git a/2025-python/output/day_09.py b/2025-python/output/day_09.py index 844d437..9bc5f03 100644 --- a/2025-python/output/day_09.py +++ b/2025-python/output/day_09.py @@ -1,3 +1,4 @@ +from math import inf from itertools import combinations from output import ints @@ -7,13 +8,21 @@ def solve(data): p1 = 0 p2 = 0 A = [tuple(ints(pos)) for pos in data.splitlines()] - + T = inf + R = 0 + B = 0 + L = inf + for r, c in A: + T = min(r, T) + R = max(c, R) + B = max(r, B) + L = min(c, L) S = A[0] V = set() - B = set() - + W = set() while True: V.add(S) + W.add(S) y, x = S he = [(r, c) for r, c in A if r == y and (r, c) not in V] ve = [(r, c) for r, c in A if c == x and (r, c) not in V] @@ -28,61 +37,41 @@ def solve(data): y2, x2 = E for r in range(min(y, y2), max(y, y2) + 1): for c in range(min(x, x2), max(x, x2) + 1): - B.add((r, c)) + W.add((r, c)) if E == A[0]: break S = E - # find out a better start for Flood fill by visualizing - Y = 1841 - X = 53478 - # or, find a way to floodfill without BFS - # end - y, x = Y, X - Q = [(y, x)] - V = V | B - while Q: - yx = Q.pop() - if yx in V: - continue - V.add(yx) - y, x = yx - for dy, dx in D: - Q.append((dy + y, dx + x)) + V = V | W for a, b in combinations(A, r=2): y1, x1 = a y2, x2 = b x = abs(x1 - x2) + 1 y = abs(y1 - y2) + 1 p1 = max(p1, x * y) - if ( - len( - set( - [ - (min(y1, y2), min(x1, x2)), - (min(y1, y2), max(x1, x2)), - (max(y1, y2), min(x1, x2)), - (max(y1, y2), max(x1, x2)), - ] - ) - - V - ) - == 0 - ): + if _within(W, a, b, T, R, B, L): p2 = max(p2, max(p2, x * y)) return p1, p2 -if __name__ == "__main__": - inp = """ -7,1 -11,1 -11,7 -9,7 -9,5 -2,5 -2,3 -7,3 """.strip() +def _within(W, a, b, T, R, B, L): + y1, x1 = a + y2, x2 = b + for r in range(min(y1, y2) + 1, max(y1, y2)): + for c in range(min(x1, x2) + 1, max(x1, x2)): + if (r, c) in W: + continue + for s, e in [(T, r), (r, B)]: + z = sum((nr, c) in W for nr in range(s, e)) + if z and z % 2 == 0: + return False + for s, e in [(L, c), (c, R)]: + z = sum((r, nc) in W for nc in range(s, e)) + if z and z % 2 == 0: + return False + return True + +if __name__ == "__main__": with open("./input/09.txt", "r") as f: inp = f.read().strip()