part1.py 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import argparse
  2. import functools
  3. from collections import defaultdict
  4. from typing import Set, List, Dict
  5. parser = argparse.ArgumentParser()
  6. parser.add_argument("ifile", type=argparse.FileType('r'))
  7. args = parser.parse_args()
  8. graph: defaultdict[str, Set[str]] = defaultdict(set)
  9. for edge in args.ifile.readlines():
  10. points = edge.strip().split('-')
  11. graph[points[0]].add(points[1])
  12. graph[points[1]].add(points[0])
  13. def depthSearch(point, path: List[str], smalls: Set[str], completedPaths: List[List[str]], graph: Dict[str, set[str]]):
  14. path.extend([point])
  15. if point == 'end':
  16. completedPaths.append(path)
  17. return
  18. for neighbor in filter(lambda p: p not in smalls and p != "start", graph[point]):
  19. if neighbor.islower():
  20. smalls.add(neighbor)
  21. depthSearch(neighbor, path, smalls, completedPaths, graph)
  22. smalls.remove(neighbor)
  23. path.pop()
  24. else:
  25. depthSearch(neighbor, path, smalls, completedPaths, graph)
  26. path.pop()
  27. done_paths = []
  28. depthSearch("start", [], set(), done_paths, graph)
  29. print(len(done_paths))