AOC2021 Puzzle 4 Python Solution

 avatar
unknown
python
4 years ago
3.0 kB
7
Indexable
# Code for advent of code 2021 puzzle 4_1 and 4_2


class Bingo:
    def __init__(self, bingo_input: list):
        self.numbers = bingo_input[0].split(",")
        self.boards = self.boards_from_input(bingo_input[2:])
        self.winning_boards = []

    def boards_from_input(self, bingo_board_list):
        boards = []
        board_lines = []
        for line in bingo_board_list:
            line = line.strip().split(" ")
            line = [val for val in line if val != ""]
            if line:
                board_lines.append(line)
            else:
                boards.append(Board(board_lines))
                board_lines = []
        boards.append(Board(board_lines))  # Add Final board
        return boards

    def get_first_winning_board(self):
        for number in self.numbers:
            for i in range(len(self.boards)):
                self.boards[i].check_number(number)
                if self.boards[i].is_complete():
                    self.boards[i].get_score(number)
                    return self.boards[i]

    def get_winning_boards(self):
        for number in self.numbers:
            for i in range(len(self.boards)):
                if not self.boards[i].score:
                    self.boards[i].check_number(number)
                    if self.boards[i].is_complete():
                        self.boards[i].get_score(number)
                        self.winning_boards.append(self.boards[i])
        return self.winning_boards


class Board:
    def __init__(self, board_lines: list):
        self.shape = (len(board_lines), len(board_lines[0]))
        self.board = board_lines
        self.state_board = [[False for val in line] for line in self.board]
        self.score = None

    def check_number(self, number):
        for i, line in enumerate(self.board):
            try:
                self.update_board(i, line.index(number))
                break
            except:
                next

    def update_board(self, i, j):
        self.state_board[i][j] = True

    def is_complete(self):
        for line in self.state_board:
            if all(line):
                return True
        for i in range(self.shape[1]):
            if all([line[i] for line in self.state_board]):
                return True
        return False

    def get_score(self, number):
        if not self.score:
            sum = 0
            for i in range(self.shape[0]):
                for j in range(self.shape[1]):
                    if not self.state_board[i][j]:
                        sum += int(self.board[i][j])
            self.score = sum * int(number)


if __name__ == "__main__":
    file = open("4.txt", "r").readlines()
    bingo = Bingo(file)
    first_board = bingo.get_first_winning_board()
    last_winning_board = bingo.get_winning_boards()[-1]
    print(f"Part 1 Answer: {first_board.score}")
    print(f"Part 2 Answer: {last_winning_board.score}")
Editor is loading...