100 lines
3.1 KiB
Python
100 lines
3.1 KiB
Python
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]))
|
|
|
|
|
|
|
|
|
|
|
|
|