···11+import copy
22+import fileinput
33+from utils import Point
44+55+board = {}
66+for y, line in enumerate(fileinput.input()):
77+ for x, c in enumerate(line.strip()):
88+ board[Point(x, y)] = int(c)
99+1010+1111+part_1 = 0
1212+1313+for i in range(10000000):
1414+ next_state = copy.copy(board)
1515+1616+ for pos, val in next_state.items():
1717+ next_state[pos] = val + 1
1818+1919+ flashed = set()
2020+ while True: # when steady state
2121+ updated = False
2222+2323+ for pos, val in next_state.items():
2424+ # Flash!
2525+ if next_state[pos] > 9 and pos not in flashed:
2626+ # Increment all 8 neighbours
2727+ for n in pos.neighbours_8():
2828+ if n not in next_state:
2929+ continue
3030+3131+ next_state[n] = next_state[n] + 1
3232+3333+ flashed.add(pos)
3434+ part_1 += 1
3535+ updated = True
3636+3737+ if not updated:
3838+ break
3939+4040+ if len(flashed) == len(next_state):
4141+ print "Part 2:", i + 1
4242+ break
4343+4444+ # Reset all >9s to 0
4545+ for pos, val in next_state.items():
4646+ if val > 9:
4747+ next_state[pos] = 0
4848+4949+ board = next_state
5050+5151+ if i == 99:
5252+ print "Part 1:", part_1