| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- import os, sys
- import numpy as np
- task_dir = os.path.dirname(__file__)
- sys.path.append(f"{task_dir}/..")
- from get_tasks import get_input, check_example, generate_readme
- def parse_input(input: str) -> tuple[np.ndarray, np.ndarray]:
- with open(input, "r") as f:
- inputs = f.read().split("\n\n")
- numbers = np.fromstring(inputs.pop(0), dtype=int, sep=",")
- boards = np.array(
- [np.fromstring(board, dtype=int, sep=" ").reshape(5, 5) for board in inputs]
- )
- return numbers, boards
- def part1(input: str):
- numbers, boards = parse_input(input)
- for round, num in enumerate(numbers):
- boards[boards == num] = -1
- for axis in [1, 2]:
- if np.any(check := np.all(boards == -1, axis=axis)):
- num_of_board = np.where(check)[0]
- board = boards[num_of_board]
- print(f"Winner board is: \n\n{board}\n")
- board[board == -1] = 0
- board.sum()
- print(
- f"Sum of all unmarked numbers is {board.sum()} and last number is {num} at the round {round}"
- )
- print(f"And the anwser of part1 is: {board.sum() * num}")
- return
- def part2(input: str):
- numbers, boards = parse_input(input)
- for round, num in enumerate(numbers):
- boards[boards == num] = -1
- for axis in [1, 2]:
- if np.any(check := np.all(boards == -1, axis=axis)):
- num_of_board = np.where(check)[0]
- prev_board = boards[num_of_board]
- boards = np.delete(boards, num_of_board, 0)
- if boards.shape[0] == 0:
- prev_board[prev_board == -1] = 0
- print(f"The last win board is \n\n {prev_board}\n")
- print(f"At the round {round} and with number {num}")
- print(f"Th sum of all unmarked mumners is {prev_board.sum()}")
- print(f"The answer of the part2 is: {prev_board.sum()* num}")
- return
- if __name__ == "__main__":
- _, _ = get_input(task_dir, 4)
- check_example("example.txt", part1)
- check_example("example.txt", part2)
- part1("input.txt")
- print("\n")
- part2("input.txt")
- generate_readme(task_dir, 4)
|