#!/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)