#!/usr/bin/env python3 import sys def flash(octop, x, y): for i in [(-1,-1), (-1,0), (-1,1), (0,-1), (0,1), (1,-1), (1,0), (1,1)]: if -1 < y+i[0] < len(octop) and -1 < x+i[1] < len(octop): if octop[y+i[0]][x+i[1]] > 0: octop[y+i[0]][x+i[1]] += 1 octop[y][x] = 0 return octop def flashable(octo): for y in octo: for x in y: if x > 9: return True return False def step(octo): nex = [[x+1 for x in y] for y in octo] flashs = 0 while flashable(nex): for x in range(len(octo[0])): for y in range(len(octo)): if nex[y][x] > 9: nex = flash(nex,x,y) flashs += 1 return nex, flashs if __name__ == '__main__': lines = open(sys.argv[1]).read().strip('\n\n').split('\n') # or split \n\n or sth similar octos = [[int(i) for i in l] for l in lines] # challenge 1 flashes, i = 0, 0 while True: i += 1 octos, f = step(octos) if(i <= 100): flashes += f if sum([sum([1 for x in range(len(octos[0])) if octos[y][x] == 0]) for y in range(len(octos))]) == 100: first = i break res1 = str(flashes) print("challenge 1:" +"\n" + res1 + "\n") # challenge 2 res2 = str(first) print("challenge 2:" +"\n" + res2 + "\n")