| import itertools | |||||
| import toolkit | |||||
| state = {k: int(v) for k, v in toolkit.read_image(text)[0].items()} | |||||
| D8 = [dx + dy for dx in [1, 0, -1] for dy in [1j, 0, -1j] if dx + dy] | |||||
| def flash(k, flashed_this_round): | |||||
| state[k] = 0 | |||||
| for p in (k + step for step in D8): | |||||
| if p in state and p not in flashed_this_round: | |||||
| state[p] += 1 | |||||
| ans1 = 0 | |||||
| for i in itertools.count(1): | |||||
| for k in state: | |||||
| state[k] += 1 | |||||
| flashed_this_round = set() | |||||
| while any(v > 9 for v in state.values()): | |||||
| for k, v in state.items(): | |||||
| if v > 9: | |||||
| flash(k, flashed_this_round) | |||||
| flashed_this_round.add(k) | |||||
| if i <= 100: | |||||
| ans1 += len(flashed_this_round) | |||||
| if len({v for v in state.values()}) == 1: | |||||
| ans2 = i | |||||
| break |