Solve 2021 day 20, 21, 23, 25
This commit is contained in:
51
2021/d20.py
Normal file
51
2021/d20.py
Normal file
@@ -0,0 +1,51 @@
|
||||
from lib import get_data
|
||||
|
||||
data = get_data(__file__)
|
||||
|
||||
for rounds in [2, 50]:
|
||||
algo, img = data.strip().split("\n\n")
|
||||
algo = algo.replace("\n", "")
|
||||
|
||||
xs = set()
|
||||
img = img.splitlines()
|
||||
for row in range(len(img)):
|
||||
for col in range(len(img[0])):
|
||||
if img[row][col] == "#":
|
||||
xs.add((row, col))
|
||||
|
||||
for i in range(rounds):
|
||||
y_min = min(v[0] for v in xs) - 6
|
||||
y_max = max(v[0] for v in xs) + 6
|
||||
x_min = min(v[1] for v in xs) - 6
|
||||
x_max = max(v[1] for v in xs) + 6
|
||||
|
||||
nxs = set()
|
||||
for row in range(y_min, y_max + 1):
|
||||
for col in range(x_min, x_max + 1):
|
||||
bin = ""
|
||||
for ro in range(3):
|
||||
for co in range(3):
|
||||
if (row + ro, col + co) in xs:
|
||||
bin += "1"
|
||||
else:
|
||||
bin += "0"
|
||||
bin = int(bin, 2)
|
||||
if algo[bin] == "#":
|
||||
nxs.add((row, col))
|
||||
|
||||
xs = nxs
|
||||
y_min_trim = y_min + 7
|
||||
y_max_trim = y_max - 8
|
||||
x_min_trim = x_min + 7
|
||||
x_max_trim = x_max - 8
|
||||
|
||||
# special clean-up required because input creates pixels when there
|
||||
# are no other pixels around (0b0_0000_0000)
|
||||
if i % 2 == 1:
|
||||
xs = [
|
||||
(r, c)
|
||||
for (r, c) in xs
|
||||
if y_min_trim <= r <= y_max_trim and x_min_trim <= c <= x_max_trim
|
||||
]
|
||||
|
||||
print(len(xs))
|
||||
Reference in New Issue
Block a user