Files
advent_of_code/2021/04.py
2021-12-12 10:22:52 -05:00

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]))