import fileinput import pprint data = [] for inp in fileinput.input(): val = inp.strip() if val == '': data.append(None) if val != '': data.append(val) # parse called numbers to_be_called = list(map(int, data[0].strip().split(','))) # parse boards boards = [] currentBoard = [] for line in data[2:]: if line == None: boards.append(currentBoard) currentBoard = [] continue line_tmp = filter(lambda x: x != '', line.split(' ')) line_tmp = map(int, line_tmp) currentBoard.append(list(line_tmp)) def is_row_valid(row, called): to_cmp = list(map(lambda x: x in called, row)) return to_cmp == len(row)*[True] def board_do_win(deb, board, calling): for row in board: if is_row_valid(row, calling): return True # generate columns columns = [] for column_index in range(len(board[0])): current_c = [] for row_index in range(len(board)): current_c.append(board[row_index][column_index]) columns.append(current_c) # if deb: # print(f'{columns=}') for column in columns: if is_row_valid(column, calling): return True return False def get_wins(): wins = [] index_to_wins = [] for i in range(len(to_be_called)): calling = to_be_called[0:(i+1)] for board_index,board in enumerate(boards): if board_index in index_to_wins: continue deb = False if calling == [7, 4, 9, 5, 11, 17, 23, 2, 0, 14, 21, 24, 10, 16, 13]: print('DEBUG==') deb = True res = board_do_win(deb, board, calling) if deb: print(res, board) if res: wins.append((board_index, calling.copy(), board)) index_to_wins.append(board_index) return wins, index_to_wins def get_score_from_board(board, calling): sum_unmarked = 0 for row in board: for e in row: if e not in calling: sum_unmarked += e return sum_unmarked * calling[-1] score = 0 wins, index_to_wins = get_wins() pprint.pprint(wins) print(f'{index_to_wins=}') i, calling, winner = wins[-1] score = get_score_from_board(winner, calling) pprint.pprint(winner) print(f'{score=}')