95 lines
2.6 KiB
Python
95 lines
2.6 KiB
Python
import shared
|
|
from itertools import groupby
|
|
from pprint import pprint as pp
|
|
from matrix import rotate, load_matrix_file, split_line_to_int_list, get_column
|
|
from copy import deepcopy
|
|
|
|
|
|
def all_equal(iterable):
|
|
g = groupby(iterable)
|
|
return next(g, True) and not next(g, False)
|
|
|
|
|
|
class Bingo:
|
|
def __init__(self, name):
|
|
self.parse(name)
|
|
|
|
def parse(self, name):
|
|
with open(name, "r") as f:
|
|
lines = [x.rstrip() for x in f.readlines()]
|
|
self.rolls = [int(x) for x in lines.pop(0).split(",")]
|
|
lines.pop(0)
|
|
|
|
self.boards = []
|
|
current_board = []
|
|
while len(lines) > 0:
|
|
line = lines.pop(0)
|
|
if line == "":
|
|
self.boards.append(current_board)
|
|
current_board = []
|
|
continue
|
|
current_board.append(split_line_to_int_list(line))
|
|
if len(lines) == 0:
|
|
self.boards.append(current_board)
|
|
self.board_snapshot = deepcopy(self.boards)
|
|
|
|
def mark_roll(self, roll):
|
|
for idB, b in enumerate(self.boards):
|
|
breaking = False
|
|
for x, row in enumerate(b):
|
|
for y, col in enumerate(row):
|
|
if col == roll:
|
|
self.boards[idB][x][y] = -1
|
|
breaking = True
|
|
break
|
|
if breaking:
|
|
break
|
|
for idB, b in enumerate(self.boards):
|
|
winning_board = self.check_remove(idB)
|
|
if winning_board:
|
|
return winning_board
|
|
|
|
def check_remove(self, board_idx):
|
|
for row in self.boards[board_idx]:
|
|
if all_equal(row):
|
|
b = self.boards.pop(board_idx)
|
|
if len(self.boards) == 0:
|
|
return b
|
|
return
|
|
for col in zip(*self.boards[board_idx]):
|
|
if all_equal(col):
|
|
b = self.boards.pop(board_idx)
|
|
if len(self.boards) == 0:
|
|
return b
|
|
return
|
|
|
|
def roll(self):
|
|
roll = self.rolls.pop(0)
|
|
self.last_roll = roll
|
|
return self.mark_roll(roll)
|
|
|
|
def roll_all(self):
|
|
while len(self.rolls):
|
|
bingoCheck = self.roll()
|
|
if bingoCheck:
|
|
self.winner = bingoCheck
|
|
return
|
|
|
|
def total(self):
|
|
total = 0
|
|
for row in self.winner:
|
|
for col in row:
|
|
if col != -1:
|
|
total += col
|
|
return total * self.last_roll
|
|
|
|
|
|
def main():
|
|
b = Bingo(shared.get_fname(4))
|
|
b.roll_all()
|
|
print(b.total())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|