/ Python / 2021 / 11.py
11.py
 1  from lib import *
 2  
 3  input = read_input(2021, 11)
 4  
 5  
 6  lines = input.splitlines()
 7  grid = [[*map(int, line)] for line in lines]
 8  out = 0
 9  for _ in range(100):
10      flashes = []
11      visited = set()
12      for i, row in enumerate(grid):
13          for j, x in enumerate(row):
14              if x >= 9:
15                  flashes.append((i, j))
16              else:
17                  row[j] += 1
18  
19      while flashes:
20          i, j = flashes.pop(0)
21          if (i, j) in visited:
22              continue
23  
24          visited.add((i, j))
25          grid[i][j] = 0
26          out += 1
27          for q, p in get_neighbors(j, i, len(lines[0]), len(lines), diag=True):
28              x = grid[p][q]
29              if x >= 9:
30                  flashes.append((p, q))
31              elif (p, q) not in visited:
32                  grid[p][q] += 1
33  
34  print(out)
35  
36  
37  grid = [[*map(int, line)] for line in lines]
38  
39  for step in irange():
40      flashes = []
41  
42      visited = set()
43  
44      for i, row in enumerate(grid):
45          for j, x in enumerate(row):
46              if x >= 9:
47                  flashes.append((i, j))
48  
49              else:
50                  row[j] += 1
51  
52      while flashes:
53          i, j = flashes.pop(0)
54  
55          if (i, j) in visited:
56              continue
57  
58          visited.add((i, j))
59  
60          grid[i][j] = 0
61  
62          for q, p in get_neighbors(j, i, len(lines[0]), len(lines), diag=True):
63              x = grid[p][q]
64  
65              if x >= 9:
66                  flashes.append((p, q))
67  
68              elif (p, q) not in visited:
69                  grid[p][q] += 1
70  
71      if len(visited) == len(lines) * len(lines[0]):
72          print(step + 1)
73          break