from lib import get_data from lib import ints data = get_data(__file__).strip() boards = [] numbers = None for i, p in enumerate(data.split("\n\n")): if i == 0: numbers = ints(p) else: board = [] for line in p.splitlines(): board.append(ints(line)) boards.append(board) assert numbers is not None first_won = None last_won = None boards_done = list() for n in numbers: for i in range(len(boards)): if i in boards_done: continue board = boards[i] board = [[f if n != f else None for f in row] for row in board] boards[i] = board for row in board: if all(cell is None for cell in row): if not i in boards_done: boards_done.append(i) for col in zip(*board): if all(cell is None for cell in col): if not i in boards_done: boards_done.append(i) if len(boards_done) > 0 and first_won is None: first_won = (i, n) if len(boards_done) == len(boards): last_won = (i, n) break if len(boards_done) == len(boards): break assert first_won is not None assert last_won is not None for i, n in [first_won, last_won]: board = boards[i] a = sum([sum([n if n is not None else 0 for n in row]) for row in board]) print(a * n)