All checks were successful
continuous-integration/drone/push Build is passing
68 lines
1.9 KiB
Python
68 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
from pathlib import Path
|
|
|
|
|
|
def enhance(algorithm, in_image, boundary):
|
|
out_image = set()
|
|
min_x = min([x for x, _ in in_image])
|
|
max_x = max([x + 1 for x, _ in in_image])
|
|
min_y = min([y for _, y in in_image])
|
|
max_y = max([y + 1 for _, y in in_image])
|
|
for y in range(min_y - boundary, max_y + boundary):
|
|
for x in range(min_x - boundary, max_x + boundary):
|
|
idx = 0
|
|
bit = 8
|
|
for dy in [-1, 0, 1]:
|
|
for dx in [-1, 0, 1]:
|
|
idx <<= 1
|
|
if (x + dx, y + dy) in in_image:
|
|
idx |= 1
|
|
if '#' == algorithm[idx]:
|
|
out_image.add((x, y))
|
|
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):
|
|
result = 0
|
|
algorithm = input[0].rstrip()
|
|
image = set([(x, y) for y, line in enumerate(input[2:])
|
|
for x, c in enumerate(line) if c == '#'])
|
|
image = enhance(algorithm, image, 3)
|
|
image = enhance(algorithm, image, -1)
|
|
result = len(image)
|
|
print("Part 1 result:", result)
|
|
|
|
|
|
def part_2(input):
|
|
result = 0
|
|
algorithm = input[0].rstrip()
|
|
image = set([(x, y) for y, line in enumerate(input[2:])
|
|
for x, c in enumerate(line) if c == '#'])
|
|
for _ in range(25):
|
|
image = enhance(algorithm, image, 3)
|
|
image = enhance(algorithm, image, -1)
|
|
result = len(image)
|
|
print("Part 2 result:", result)
|
|
|
|
|
|
input = list()
|
|
p = Path(__file__).with_name('input.txt')
|
|
with open(p) as f:
|
|
input = f.readlines()
|
|
part_1(input)
|
|
part_2(input)
|