day4.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import os
  2. import numpy as np
  3. with open(os.path.join(os.path.dirname(__file__), "example.txt")) as example:
  4. example_data = example.read().splitlines()
  5. with open(os.path.join(os.path.dirname(__file__), "input.txt")) as example:
  6. input_data = example.read().splitlines()
  7. def part1(data):
  8. grid = np.array([list(w) for w in data])
  9. sum = 0
  10. grid = np.pad(grid, pad_width=((1, 1), (1, 1)), mode="constant", constant_values="_")
  11. H, W = grid.shape
  12. for i in range(H - 3 + 2):
  13. for j in range(W - 3 + 2):
  14. if grid[i, j] == "@":
  15. subgrid = grid[i - 1 : i + 2, j - 1 : j + 2]
  16. count = np.sum(subgrid == "@")
  17. if count < 5:
  18. sum += 1
  19. print(f"Part 1: {sum=}")
  20. def part2(data):
  21. grid = np.array([list(w) for w in data])
  22. sum = 0
  23. grid = np.pad(grid, pad_width=((1, 1), (1, 1)), mode="constant", constant_values="_")
  24. H, W = grid.shape
  25. can_remove = True
  26. rounds = 0
  27. while can_remove:
  28. coords2remove = []
  29. for i in range(H - 3 + 2):
  30. for j in range(W - 3 + 2):
  31. if grid[i, j] == "@":
  32. subgrid = grid[i - 1 : i + 2, j - 1 : j + 2]
  33. count = np.sum(subgrid == "@")
  34. if count < 5:
  35. sum += 1
  36. coords2remove.append((i, j))
  37. if len(coords2remove) == 0:
  38. can_remove = False
  39. else:
  40. rounds += 1
  41. grid[tuple(zip(*coords2remove))] = "."
  42. print(f"Part 2: {sum=} after {rounds} rounds")
  43. part1(example_data)
  44. part1(input_data)
  45. part2(example_data)
  46. part2(input_data)