def enhance(pos, cache={}): seq = tuple(image.get(pos + d, infinity) for d in D9) key = infinity, seq if key not in cache: cache[key] = alg[int(''.join({'.':'0', '#':'1'}[x] for x in seq), 2)] return cache[key] text = open(0).read() alg, text = text.split('\n\n') D9 = [dx + dy for dy in [-1j, 0, 1j] for dx in [-1, 0, 1]] image = {} for y, line in enumerate(text.splitlines()): for x, char in enumerate(line): image[complex(x, y)] = char X, Y = x, y for i in range(1, 50 + 1): infinity = '#.'[i % 2] image = {(x + y * 1j): enhance(x + y * 1j) for x in range(0 - 2 * i, X + 2 * i) for y in range(0 - 2 * i, Y + 2 * i) } if i in {2, 50}: print(sum(v == '#' for v in image.values()))