day4.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 bench(part):
  8. import time
  9. def wrapper(*args, **kwargs):
  10. start = time.perf_counter()
  11. value = part(*args, **kwargs)
  12. print(f"\tevaluation time: {time.perf_counter() - start} s")
  13. return value
  14. return wrapper
  15. def part1(data):
  16. grid = np.array([list(w) for w in data])
  17. sum = 0
  18. grid = np.pad(grid, pad_width=((1, 1), (1, 1)), mode="constant", constant_values="_")
  19. H, W = grid.shape
  20. for i in range(H - 3 + 2):
  21. for j in range(W - 3 + 2):
  22. if grid[i, j] == "@":
  23. subgrid = grid[i - 1 : i + 2, j - 1 : j + 2]
  24. count = np.sum(subgrid == "@")
  25. if count < 5:
  26. sum += 1
  27. print(f"Part 1: {sum=}")
  28. @bench
  29. def part2(data):
  30. grid = np.array([list(w) for w in data])
  31. sum = 0
  32. grid = np.where(grid == "@", 1, 0)
  33. grid = np.pad(grid, pad_width=((1, 1), (1, 1)), mode="constant", constant_values=0)
  34. H, W = grid.shape
  35. can_remove = True
  36. rounds = 0
  37. while can_remove:
  38. removed = 0
  39. for i in range(H - 3 + 2):
  40. for j in range(W - 3 + 2):
  41. if grid[i, j] == 1:
  42. subgrid = grid[i - 1 : i + 2, j - 1 : j + 2]
  43. count = np.sum(subgrid)
  44. if count < 5:
  45. sum += 1
  46. grid[i, j] = 0
  47. removed += 1
  48. if removed == 0:
  49. can_remove = False
  50. else:
  51. rounds += 1
  52. print(f"Part 2: {sum=} after {rounds} rounds")
  53. part1(example_data)
  54. part1(input_data)
  55. part2(example_data)
  56. part2(input_data)