From c88196ecae5e477bcc152da6d8b266e5cbace17c Mon Sep 17 00:00:00 2001 From: dece Date: Sat, 25 Dec 2021 17:10:05 +0100 Subject: [PATCH] Day 20 --- 2021/day20.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 2021/day20.py diff --git a/2021/day20.py b/2021/day20.py new file mode 100644 index 0000000..5dff5c4 --- /dev/null +++ b/2021/day20.py @@ -0,0 +1,38 @@ +from operator import itemgetter as ig + +with open("input20.txt") as f: + lines = [line.rstrip() for line in f] +iea = lines[0] +data = { + (x, y): c == "#" + for x, line in enumerate(lines[2:]) + for y, c in enumerate(line) +} + + +def near(x, y): + return ((a, b) for a in range(x - 1, x + 2) for b in range(y - 1, y + 2)) + + +def enhance(image, unkv): + next_image = {} + xmin, ymin = min(image, key=ig(0))[0] - 1, min(image, key=ig(1))[1] - 1 + xmax, ymax = max(image, key=ig(0))[0] + 1, max(image, key=ig(1))[1] + 1 + for x in range(xmin, xmax + 1): + for y in range(ymin, ymax + 1): + v = 0 + for nnp in near(x, y): + v = (v << 1) | int(image.get(nnp, unkv)) + next_image[(x, y)] = iea[v] == "#" + return next_image + + +def solve(num_steps): + image = data + for i in range(num_steps): + image = enhance(image, i % 2 == 1) + print(sum(image.values())) + + +solve(2) +solve(50)