main.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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()} \
  27. and last number is {num} at the round {round}"
  28. )
  29. print(f"And the anwser of part1 is: {board.sum() * num}")
  30. return
  31. def part2(input: str):
  32. numbers, boards = parse_input(input)
  33. for round, num in enumerate(numbers):
  34. boards[boards == num] = -1
  35. for axis in [1, 2]:
  36. if np.any(check := np.all(boards == -1, axis=axis)):
  37. num_of_board = np.where(check)[0]
  38. prev_board = boards[num_of_board]
  39. boards = np.delete(boards, num_of_board, 0)
  40. if boards.shape[0] == 0:
  41. prev_board[prev_board == -1] = 0
  42. print(f"The last win board is \n\n {prev_board}\n")
  43. print(f"At the round {round} and with number {num}")
  44. print(f"Th sum of all unmarked mumners is {prev_board.sum()}")
  45. print(f"The answer of the part2 is: {prev_board.sum()* num}")
  46. return
  47. if __name__ == "__main__":
  48. _, _ = get_input(task_dir, 4)
  49. check_example("example.txt", part1)
  50. check_example("example.txt", part2)
  51. part1("input.txt")
  52. print("\n")
  53. part2("input.txt")
  54. generate_readme(task_dir, 4)