Day 4: Printing Department
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465


Turns out on part 2 you can remove on access rather than after a full sweep of the grid, which cuts down the number of iterations you need to do about 1/2 sometimes 1/3 (depending on input).
import itertools as it from pathlib import Path import numpy as np cwd = Path(__file__).parent.resolve() def parse_input(file_path): with file_path.open("r") as fp: grid = np.array(list(map(list, list(map(str.strip, fp.readlines())))), dtype=str) return grid def solve_problem(file_name, single_attempt=True): grid = parse_input(Path(cwd, file_name)) nr, nc = grid.shape nacc_total = 0 stop = False while not stop: nacc = 0 for i,j in it.product(range(nr), range(nc)): if grid[i,j] != '@': continue if np.count_nonzero(grid[max(i-1, 0):min(i+2, nr), max(j-1, 0):min(j+2, nc)] == '@')<5: nacc += 1 if not single_attempt: grid[i,j] = '.' nacc_total += nacc if nacc==0 or single_attempt: stop = True return nacc_total