Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.22 KB | None | 0 0
  1. from typing import Dict, List
  2. import os
  3.  
  4.  
  5. def parse(input: str) -> Dict[str, List[str]]:
  6.     lines = input.split("\n")[:-1]
  7.     # Bidrectional adjacency list
  8.     t = {}
  9.     for line in lines:
  10.         # b orbits a
  11.         a, b = line.split(")")
  12.  
  13.         children = t.get(a, [])
  14.         children.append(b)
  15.         t[a] = children
  16.  
  17.         children = t.get(b, [])
  18.         children.append(a)
  19.         t[b] = children
  20.     return t
  21.  
  22.  
  23. def open_file(filename: str):
  24.     # Relative to script directory
  25.     path = os.path.join(os.path.dirname(__file__), filename)
  26.     return open(path, "r")
  27.  
  28.  
  29. def part1():
  30.     with open_file("input1.txt") as f:
  31.         # Tree with root node "com"
  32.         tree = parse(f.read())
  33.         root = "COM"
  34.         # Calculate sum of distances between root and each node
  35.         # BFS traversal
  36.         q = []
  37.         q.extend(tree[root])
  38.         seen = set([root])
  39.         distances = 0
  40.         level = 1
  41.         while len(q) > 0:
  42.             q_next = []
  43.             for node in q:
  44.                 if node not in seen:
  45.                     distances += level
  46.                     children = tree.get(node, [])
  47.                     q_next.extend(children)
  48.                     seen.add(node)
  49.             level += 1
  50.             q = q_next
  51.         return distances
  52.  
  53.  
  54. def part2():
  55.     with open_file("input2.txt") as f:
  56.         # Tree with root node "com"
  57.         tree = parse(f.read())
  58.         you = "YOU"
  59.         santa = "SAN"
  60.         # Use BFS to find shortest path
  61.         # between nodes "YOU" and "SAN"
  62.         q = []
  63.         q.extend(tree[you])
  64.         seen = set([you])
  65.         dist = 1
  66.         while len(q) > 0:
  67.             q_next = []
  68.             for node in q:
  69.                 if node not in seen:
  70.                     if node == santa:
  71.                         # Don't count santa and you
  72.                         return dist - 2
  73.                     children = tree.get(node, [])
  74.                     q_next.extend(children)
  75.                     seen.add(node)
  76.             dist += 1
  77.             q = q_next
  78.         raise Exception("Didn't find Santa")
  79.  
  80.  
  81. def main() -> None:
  82.     print(part1())  # 147807
  83.     print(part2())  # 229
  84.  
  85.  
  86. if __name__ == '__main__':
  87.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement