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
You are viewing a single thread.
View all comments 3 points
*
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
1 point
*