Day 10: Hoof It
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
Python
Not surprisingly, trees
import numpy as np from pathlib import Path cwd = Path(__file__).parent cross = np.array([[-1,0],[1,0],[0,-1],[0,1]]) class Node(): def __init__(self, coord, parent): self.coord = coord self.parent = parent def __repr__(self): return f"{self.coord}" def parse_input(file_path): with file_path.open("r") as fp: data = list(map(list, fp.read().splitlines())) return np.array(data, dtype=int) def find_neighbours(node_pos, grid): I = list(filter(lambda x: all([c>=0 and o-c>0 for c,o in zip(x,grid.shape)]), list(cross + node_pos))) candidates = grid[tuple(np.array(I).T)] J = np.argwhere(candidates-grid[tuple(node_pos)]==1).flatten() return list(np.array(I).T[:, J].T) def construct_tree_paths(grid): roots = list(np.argwhere(grid==0)) trees = [] for root in roots: levels = [[Node(root, None)]] while len(levels[-1])>0 or len(levels)==1: levels.append([Node(node, root) for root in levels[-1] for node in find_neighbours(root.coord, grid)]) trees.append(levels) return trees def trace_back(trees, grid): paths = [] for levels in trees: for node in levels[-2]: path = "" while node is not None: coord = ",".join(node.coord.astype(str)) path += f"{coord} " node = node.parent paths.append(path) return paths def solve_problem(file_name): grid = parse_input(Path(cwd, file_name)) trees = construct_tree_paths(grid) trails = trace_back(trees, grid) ntrails = len(set(trails)) nreached = sum([len(set([tuple(x.coord) for x in levels[-2]])) for levels in trees]) return nreached, ntrails
yay trees! my solution was really fast too! 😀
edit: you can find it here, or look at my lemmy post
should take only 1.5 milliseconds!