import json def test_winner(board, drawn_numbers): for one_combination in board['winning_combinations']: total = 0 if set(one_combination).issubset(set(drawn_numbers)): for one_number in one_bingo['numbers']: if one_number not in drawn_numbers: total += int(one_number) return int(total) * int(drawn_numbers[-1]) return -1 with open('./2021/04.input', 'r') as input_file: # with open('./2021/04.test', 'r') as input_file: input_data = input_file.read() number_list = input_data.split('\n\n')[0].split(',') print(number_list) bingo_boards = input_data.split('\n\n')[1:] bingo_dicts = [] for one_board in bingo_boards: one_bingo = {} one_bingo['numbers'] = [] one_bingo['winning_combinations'] = [] rows = one_board.split('\n') for row in range(len(rows)): columns = rows[row].split(' ') columns = list(filter("".__ne__, columns)) one_bingo['numbers'].extend(columns) one_bingo['winning_combinations'].append(columns) for column in range(len(columns)): winning_column = [] for row in range(len(rows)): print(row, column, row * column) winning_column.append(one_bingo['numbers'][row * len(columns) + column]) print(winning_column) one_bingo['winning_combinations'].append(winning_column) bingo_dicts.append(one_bingo) # Find a winning board. winner_found = False for i in range(4, len(number_list)): drawn_numbers = number_list[:i] print("Drawn numbers", drawn_numbers) for one_bingo in bingo_dicts: for one_combination in one_bingo['winning_combinations']: total = 0 if set(one_combination).issubset(set(drawn_numbers)): # Get the board print("Winning Combination", one_combination) print("Winning Board", one_bingo['numbers']) one_bingo['numbers'].sort() print("Winning Sorted", one_bingo['numbers']) for one_number in one_bingo['numbers']: if one_number not in drawn_numbers: total += int(one_number) print(total) winner_found = True print(total, drawn_numbers[-1], int(total) * int(drawn_numbers[-1])) if winner_found: break if winner_found: break if winner_found: break boards_left = bingo_dicts.copy() for i in range(4, len(number_list)): drawn_numbers = number_list[:i] # Test for winner. If winner, eliminate. for one_board in range(len(boards_left) - 1, 0, -1): total = 0 for one_combination in boards_left[one_board]: if set(one_combination).issubset(set(drawn_numbers)) and len(boards_left) > 1: # Remove the board del boards_left[one_board] for one_number in one_bingo['numbers']: if one_number not in drawn_numbers: total += int(one_number) print(len(boards_left)) print(total) winner_found = True print(total, drawn_numbers[-1], int(total) * int(drawn_numbers[-1]))