#!/usr/bin/env python3 from pathlib import Path def enhance(algorithm, in_image, b): out_image = [] for i in range(-b, len(in_image) + b): line = '' for j in range(-b, len(in_image[0]) + b): idx = '' for k in range(i - 1, i + 2): for l in range(j - 1, j + 2): if 0 <= k < len(in_image) and \ 0 <= l < len(in_image[k]) and\ '#' == in_image[k][l]: idx += '1' else: idx += '0' idx = int(idx, 2) line += algorithm[idx] out_image.append(line) return out_image def part_1(input): result = 0 algorithm = input[0].rstrip() image = [] for line in input[2:]: image.append(line.rstrip()) image = enhance(algorithm, image, 3) image = enhance(algorithm, image, -1) for line in image: result += line.count('#') print("Part 1 result:", result) def part_2(input): result = 0 algorithm = input[0].rstrip() image = [] for line in input[2:]: image.append(line.rstrip()) for _ in range(25): image = enhance(algorithm, image, 3) image = enhance(algorithm, image, -1) for line in image: result += line.count('#') 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)