from utils import open_day bg = False img = dict() with open_day(20) as f: first, rest = f.read().rstrip().split('\n\n') alg = [c == '#' for c in first] for y, line in enumerate(rest.split('\n')): for x, c in enumerate(line): img[(x, y)] = c == '#' def bits_at(img, x, y): bits = [] for dx, dy in ((-1, -1), (0, -1), (1, -1), (-1, 0), (0, 0), (1, 0), (-1, 1), (0, 1), (1, 1)): bits.append(img.get((x + dx, y + dy), bg)) val = int(''.join('1' if b else '0' for b in bits), 2) return val def iter(): global bg, img new = dict() minx, maxx = float('inf'), float('-inf') miny, maxy = float('inf'), float('-inf') for p, v in img.items(): if not v: continue x, y = p minx, maxx = min(minx, x), max(maxx, x) miny, maxy = min(miny, y), max(maxy, y) for y in range(miny - 1, maxy + 2): for x in range(minx - 1, maxx + 2): new[(x, y)] = alg[bits_at(img, x, y)] img = new bg = not bg iter() iter() print(sum(img.values())) for _ in range(48): iter() print(sum(img.values()))