main.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import os, sys
  2. import numpy as np
  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. def parse_input(input: str) -> tuple[np.ndarray, np.ndarray]:
  7. with open(input, "r") as f:
  8. inputs = f.read().split("\n\n")
  9. numbers = np.fromstring(inputs.pop(0), dtype=int, sep=",")
  10. boards = np.array(
  11. [np.fromstring(board, dtype=int, sep=" ").reshape(5, 5) for board in inputs]
  12. )
  13. return numbers, boards
  14. def part1(input: str):
  15. numbers, boards = parse_input(input)
  16. for round, num in enumerate(numbers):
  17. boards[boards == num] = -1
  18. for axis in [1, 2]:
  19. if np.any(check := np.all(boards == -1, axis=axis)):
  20. num_of_board = np.where(check)[0]
  21. board = boards[num_of_board]
  22. print(f"Winner board is: \n\n{board}\n")
  23. board[board == -1] = 0
  24. board.sum()
  25. print(
  26. f"Sum of all unmarked numbers is {board.sum()} and last number is {num} at the round {round}"
  27. )
  28. print(f"And the anwser of part1 is: {board.sum() * num}")
  29. return
  30. def part2(input: str):
  31. numbers, boards = parse_input(input)
  32. for round, num in enumerate(numbers):
  33. boards[boards == num] = -1
  34. for axis in [1, 2]:
  35. if np.any(check := np.all(boards == -1, axis=axis)):
  36. num_of_board = np.where(check)[0]
  37. prev_board = boards[num_of_board]
  38. boards = np.delete(boards, num_of_board, 0)
  39. if boards.shape[0] == 0:
  40. prev_board[prev_board == -1] = 0
  41. print(f"The last win board is \n\n {prev_board}\n")
  42. print(f"At the round {round} and with number {num}")
  43. print(f"Th sum of all unmarked mumners is {prev_board.sum()}")
  44. print(f"The answer of the part2 is: {prev_board.sum()* num}")
  45. return
  46. if __name__ == "__main__":
  47. _, _ = get_input(task_dir, 4)
  48. check_example("example.txt", part1)
  49. check_example("example.txt", part2)
  50. part1("input.txt")
  51. print("\n")
  52. part2("input.txt")
  53. generate_readme(task_dir, 4)