Files
advent-of-code-2021/day-20/day-20.py
Pascal Lais aae16d3c46
Some checks failed
continuous-integration/drone/push Build is failing
Add game of life algorithm for fun
2021-12-20 12:37:19 +01:00

82 lines
2.8 KiB
Python

#!/usr/bin/env python3
from pathlib import Path
from time import sleep
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)
def game_of_life(input):
result = 0
algorithm = '.......#...#.##....#.###.######....#.##..##.#....######.###.#......#.##..##.#....######.###.#....##.#...#.......###.#...#..........#.##..##.#....######.###.#....##.#...#.......###.#...#........##.#...#.......###.#...#.......#...............#..................#.##..##.#....######.###.#....##.#...#.......###.#...#........##.#...#.......###.#...#.......#...............#................##.#...#.......###.#...#.......#...............#...............#...............#...............................................'
image = set([(x, y) for y, line in enumerate(input[2:])
for x, c in enumerate(line) if c == '#'])
while True:
image = enhance(algorithm, image, 0)
show(image)
print()
sleep(0.1)
input = list()
p = Path(__file__).with_name('input2.txt')
with open(p) as f:
input = f.readlines()
part_1(input)
part_2(input)
# game_of_life(input)