···3636for it in range(18):
3737 # Build up our list of subgrids
3838 if it % 3 == 0:
3939- GRIDS = []
4040- ORIG_GRIDS = []
4141- for inp in SUBGRIDS:
4242- GRIDS.append([list(inp[n:n+3]) for n in range(0, 9, 3)])
4343- ORIG_GRIDS.append(inp)
3939+ GRIDS = {}
4040+ for key in SUBGRIDS:
4141+ GRIDS[key] = [list(key[n:n+3]) for n in range(0, 9, 3)]
44424545- NEW_GRIDS = []
4646- for grid in GRIDS:
4343+ for key, grid in GRIDS.items():
4744 size = len(grid)
4845 d = 2 if size % 2 == 0 else 3
4946···5350 for y in range(size // d):
5451 for x in range(size // d):
5552 # Build the string representation of each 2x2 or 3x3 subgrid
5656- subgrid = ''
5353+ subgrid = ''.join(
5454+ ''.join(grid[y*d + k][x*d:(x+1)*d])
5555+ for k in range(d)
5656+ )
57575858- for k in range(d):
5959- subgrid += ''.join(grid[y*d + k][x*d:(x+1)*d])
5858+ # Lookup the corresponding rule and populate the new grid
5959+ rule = RULES[subgrid]
60606161- # Lookup the corresponding rule and populate the new grid
6262- out = RULES[subgrid]
6361 for ny in range(d+1):
6462 for nx in range(d+1):
6565- new_grid[y*(d+1) + ny][x*(d+1) + nx] = out[ny*(d+1) + nx]
6666-6767- NEW_GRIDS.append(new_grid)
6363+ new_grid[y*(d+1) + ny][x*(d+1) + nx] = rule[ny*(d+1) + nx]
68646969- GRIDS = NEW_GRIDS
6565+ GRIDS[key] = new_grid
70666767+ # Print puzzle output before updating subgrid count
7168 if it in (4, 17):
7272- num_pixels = sum(lit_pixels(g) * SUBGRIDS[ORIG_GRIDS[i]] for i, g in enumerate(GRIDS))
7373- print "Lit pixels after {} iterations:".format(it + 1), num_pixels
6969+ num_pixels = sum(lit_pixels(grid) * SUBGRIDS[key] for key, grid in GRIDS.items())
7070+ print "Lit pixels after {} iterations: {}".format(it + 1, num_pixels)
74717572 # Update the count of independent 3x3 subgrids
7673 if it % 3 == 2:
7774 next_subgrids = Counter()
7878- for i, grid in enumerate(GRIDS):
7979- mult = SUBGRIDS[ORIG_GRIDS[i]]
7575+ for grid_key, grid in GRIDS.items():
7676+ subgrid_count = SUBGRIDS[grid_key]
8077 for y in range(0, 9, 3):
8178 for x in range(0, 9, 3):
8279 key = ''.join(
8380 ''.join(grid[y+n][x:x+3])
8481 for n in range(3)
8582 )
8686- next_subgrids[key] += mult
8383+ next_subgrids[key] += subgrid_count
87848885 SUBGRIDS = next_subgrids