| 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())) |