Optimize day 20 solution
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2021-12-20 12:17:06 +01:00
parent a81d7b914c
commit c80d4e7ac5

View File

@@ -3,55 +3,59 @@ from pathlib import Path
def enhance(algorithm, in_image, boundary): def enhance(algorithm, in_image, boundary):
out_image = [] out_image = set()
height = len(in_image) min_x = min([x for x, _ in in_image])
width = len(in_image[0]) max_x = max([x + 1 for x, _ in in_image])
for i in range(-boundary, height + boundary): min_y = min([y for _, y in in_image])
line = '' max_y = max([y + 1 for _, y in in_image])
valid = False for y in range(min_y - boundary, max_y + boundary):
for j in range(-boundary, width + boundary): for x in range(min_x - boundary, max_x + boundary):
idx = '' idx = 0
for k in range(i - 1, i + 2): bit = 8
for l in range(j - 1, j + 2): for dy in [-1, 0, 1]:
if 0 <= k < height and \ for dx in [-1, 0, 1]:
0 <= l < width and \ idx <<= 1
'#' == in_image[k][l]: if (x + dx, y + dy) in in_image:
idx += '1' idx |= 1
else: if '#' == algorithm[idx]:
idx += '0' out_image.add((x, y))
idx = int(idx, 2)
if not valid and '#' == algorithm[idx]:
valid = True
line += algorithm[idx]
if valid:
out_image.append(line)
return out_image return out_image
def show(image):
min_x = min([x for x, _ in image])
max_x = max([x + 1 for x, _ in image])
min_y = min([y for _, y in image])
max_y = max([y + 1 for _, y in image])
for y in range(min_y, max_y):
for x in range(min_x, max_x):
if (x, y) in image:
print('#', end='')
else:
print('.', end='')
print()
def part_1(input): def part_1(input):
result = 0 result = 0
algorithm = input[0].rstrip() algorithm = input[0].rstrip()
image = [] image = set([(x, y) for y, line in enumerate(input[2:])
for line in input[2:]: for x, c in enumerate(line) if c == '#'])
image.append(line.rstrip())
image = enhance(algorithm, image, 3) image = enhance(algorithm, image, 3)
image = enhance(algorithm, image, -1) image = enhance(algorithm, image, -1)
for line in image: result = len(image)
result += line.count('#')
print("Part 1 result:", result) print("Part 1 result:", result)
def part_2(input): def part_2(input):
result = 0 result = 0
algorithm = input[0].rstrip() algorithm = input[0].rstrip()
image = [] image = set([(x, y) for y, line in enumerate(input[2:])
for line in input[2:]: for x, c in enumerate(line) if c == '#'])
image.append(line.rstrip())
for _ in range(25): for _ in range(25):
image = enhance(algorithm, image, 3) image = enhance(algorithm, image, 3)
image = enhance(algorithm, image, -1) image = enhance(algorithm, image, -1)
for line in image: result = len(image)
result += line.count('#')
print("Part 2 result:", result) print("Part 2 result:", result)