Files
Advent-of-Code-2021/4.py
2021-12-04 10:58:09 +01:00

65 lines
1.4 KiB
Python

import numpy as np
def has_bingo(board: np.ndarray) -> bool:
for row in board:
if np.all(row == -1):
return True
for col in board.T:
if np.all(col == -1):
return True
return False
def part_one(boards, number):
for number in numbers:
boards[boards == number] = -1
for board in boards:
if has_bingo(board):
return board[board != -1].sum() * number
def part_two(boards: np.ndarray, number):
for number in numbers:
boards[boards == number] = -1
done_boards = []
for b, board in enumerate(boards):
if has_bingo(board):
done_boards.append(b)
if len(boards) == 1 and len(done_boards) == 1:
board = boards[0]
return board[board != -1].sum() * number
boards = np.delete(boards, done_boards, 0)
if __name__ == "__main__":
import sys
numbers = [int(x) for x in input().split(",")]
input() # Skip blank line
boards = []
current_board = []
for line in sys.stdin:
if line != "\n":
current_board.append([int(x) for x in line.split()])
else:
boards.append(current_board)
current_board = []
boards = np.array(boards)
print("Winning board:", part_one(boards.copy(), numbers))
print("Losing board :", part_two(boards.copy(), numbers))