main.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from doctest import Example
  2. import os, sys
  3. task_dir = os.path.dirname(__file__)
  4. sys.path.append(f"{task_dir}/..")
  5. from get_tasks import get_input, check_example, generate_readme
  6. from collections import deque, defaultdict
  7. def parse(input: list[str]) -> dict:
  8. in_map_cave = defaultdict(list)
  9. for line in input:
  10. a, b = line.split("-")
  11. in_map_cave[a].append(b)
  12. if a != "start" and b != "end":
  13. in_map_cave[b].append(a)
  14. return dict(in_map_cave)
  15. def findpaths(map_cave: dict, twice=False) -> tuple[int, list]:
  16. paths = []
  17. path = ["start"]
  18. q = deque([path])
  19. state_q = deque([False])
  20. while q:
  21. path = q.popleft()
  22. double_visited = state_q.popleft()
  23. if path[-1] == "end":
  24. paths.append(path)
  25. continue
  26. for cave in map_cave[path[-1]]:
  27. if not (cave.islower() and (cave in path)):
  28. q.append(path + [cave])
  29. state_q.append(double_visited)
  30. elif not double_visited and twice:
  31. state_q.append(True)
  32. q.append(path + [cave])
  33. return len(paths), paths
  34. def findpaths_first_version(map_cave: dict) -> tuple[int, list]:
  35. paths = []
  36. path = ["start"]
  37. q = deque([path])
  38. while q:
  39. path = q.popleft()
  40. if path[-1] == "end":
  41. paths.append(path)
  42. continue
  43. for cave in map_cave[path[-1]]:
  44. if not (cave.islower() and (cave in path)):
  45. newpath = path.copy()
  46. newpath.append(cave)
  47. q.append(newpath)
  48. return len(paths), paths
  49. def part1(input: list[str]):
  50. l, _ = findpaths(parse(input))
  51. print("The answer of part1 is:", l)
  52. def part2(input: list[str]):
  53. l, _ = findpaths(parse(input), twice=True)
  54. print("The answer of part2 is:", l)
  55. if __name__ == "__main__":
  56. input, example = get_input(task_dir, 12)
  57. check_example(example, part1)
  58. check_example(example, part2)
  59. part1(input)
  60. part2(input)
  61. generate_readme(task_dir, 12)