#!/usr/bin/env python3 from pathlib import Path def part_1(input): result = 0 m = {} for y, line in enumerate(input): for x, d in enumerate(line.rstrip()): m[(x, y)] = int(d) for _ in range(100): pending_flash = set() flashed = set() for k in m: m[k] += 1 if m[k] > 9: pending_flash.add(k) while len(pending_flash): k = pending_flash.pop() flashed.add(k) result += 1 min_x = max(k[0] - 1, 0) max_x = min(k[0] + 2, 10) min_y = max(k[1] - 1, 0) max_y = min(k[1] + 2, 10) for y in range(min_y, max_y): for x in range(min_x, max_x): m[(x, y)] += 1 if m[(x, y)] > 9 and (x, y) not in pending_flash and (x, y) not in flashed: pending_flash.add((x, y)) for k in flashed: m[k] = 0 # for y in range(10): # for x in range(10): # print(m[(x, y)], end='') # print() # print() print("Part 1 result:", result) def part_2(input): result = 0 m = {} for y, line in enumerate(input): for x, d in enumerate(line.rstrip()): m[(x, y)] = int(d) s = 0 while not result: s += 1 pending_flash = set() flashed = set() for k in m: m[k] += 1 if m[k] > 9: pending_flash.add(k) while len(pending_flash): k = pending_flash.pop() flashed.add(k) min_x = max(k[0] - 1, 0) max_x = min(k[0] + 2, 10) min_y = max(k[1] - 1, 0) max_y = min(k[1] + 2, 10) for y in range(min_y, max_y): for x in range(min_x, max_x): m[(x, y)] += 1 if m[(x, y)] > 9 and (x, y) not in pending_flash and (x, y) not in flashed: pending_flash.add((x, y)) for k in flashed: m[k] = 0 if len(flashed) == 100: result = s print("Part 2 result:", result) input = list() p = Path(__file__).with_name('input.txt') with open(p) as f: input = f.readlines() part_1(input) part_2(input)