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

  • iAvicenna@lemmy.world
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    16 days ago

    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
    
    • Acters@lemmy.world
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      15 days ago

      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!