main.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import os, sys
  2. import numpy as np
  3. from functools import partial
  4. task_dir = os.path.dirname(__file__)
  5. sys.path.append(f"{task_dir}/..")
  6. from get_tasks import get_input, generate_readme, check_example
  7. def parse_input(inputs: list[str]):
  8. return np.array([list(line.strip()) for line in inputs], dtype=int)
  9. def part1(cave: np.ndarray) -> np.ndarray:
  10. centers = np.array([0, 0], dtype=int)
  11. mins = np.array([], dtype=int)
  12. for i in range(cave.shape[0]):
  13. for j in range(cave.shape[1]):
  14. if (here := cave[i, j]) == (
  15. win := cave[max(0, i - 1) : i + 2, max(0, j - 1) : j + 2]
  16. ).min():
  17. mins = np.append(mins, here)
  18. centers = np.vstack([centers, [i, j]])
  19. centers = np.delete(centers, 0, 0)
  20. print("The answer of part1 is:", (mins + 1).sum())
  21. return centers
  22. def part2(cave: np.ndarray, centers_basins: np.ndarray):
  23. def get_dirs(center):
  24. i, j = center
  25. up = max(0, i - 1), j
  26. left = i, max(0, j - 1)
  27. down = min(i + 1, i_size), j
  28. right = i, min(j_size, j + 1)
  29. return up, left, down, right
  30. for idx, center in enumerate(centers_basins):
  31. queue = []
  32. i, j = center
  33. i_size, j_size = cave.shape
  34. i_size, j_size = i_size - 1, j_size - 1
  35. queue.append((i, j))
  36. cave[i, j] = idx + 11
  37. while queue:
  38. pos = queue.pop()
  39. for dir in get_dirs(pos):
  40. if cave[dir] < 9:
  41. cave[dir] = idx + 11
  42. queue.append(dir)
  43. print(
  44. "The answer of part2 is:",
  45. np.sort(np.unique(cave[np.where(cave > 10)], return_counts=1)[1])[-3:].prod(),
  46. )
  47. if __name__ == "__main__":
  48. input, example = get_input(task_dir, 9)
  49. example_cave = parse_input(example)
  50. real_cave = parse_input(input)
  51. check_example(example_cave, part1)
  52. example_basins = part1(example_cave)
  53. check_part2 = partial(part2, example_cave)
  54. check_example(example_basins, check_part2)
  55. centers_basisns = part1(real_cave)
  56. part2(real_cave, centers_basisns)
  57. generate_readme(task_dir, 9)