# AoC2021 day4

unknown
python
3 years ago
2.8 kB
5
Indexable
Never
```import sys
import re

path = sys.argv[1]

with open(path, 'r') as file:
lines = list(line for line in lines if line) #load everything else as rows

row = list(re.split(' +',lines[0])) # split on spaces
size = len(row) # determine the size of the bingo board (assume square)
numboards = 0
board=[] # an individual board
boards=[] # the list of all boards

def check_num(board,num): # check a board for the called number
for i,row in enumerate(board):
#y = [0 if x==1 else x for x in y]
row = ["X" if x == num else x for x in row] # replace with X if found
board[i] = row

def check_bingo(board): # checks a board for a bingo
for row in board:
res=all(numbers == "X" for numbers in row) # if a row is all Xs then return true
if res:
return res

board_rot = [[board[j][i] for j in range(len(board))] for i in range(len(board[0]))] # rotate the board 90deg
for row in board_rot:
res=all(numbers == "X" for numbers in row) # if a row (was col) is all Xs then return true
if res:
return res
return res

def sum_board(board): # total all remaining numbers on the board
total = 0
for row in board:
for num in row:
if num != "X":
total += int(num)

i=0
for line in lines: # Load the data into the boards
row = list(re.split(' +',line.strip()))
board.append(row)
if i == size-1: # hacky, should be variable
boards.append(board)
numboards += 1
board=[]
i=0
else:
i += 1

allboards=len(boards) # number of boards
won=0 # has there been a winning board?

for num in numbers.split(","): # for each number
newboards=boards # copy the list of boards
for board in newboards: # for each board in the list
check_num(board,num) # check it for the number
for board in newboards:
bingo = check_bingo(board) # check if it's a bingo
if bingo:                   # if it is then
total=sum_board(board) # find the total of numbers remaining
boards.remove(board)    # remove the winning board from the list
allboards=len(boards) # calculate the number of remaining boards
if won==0: # if this is the first winning board (ie part 1)
print("First: ",int(num)*int(total)) # print the total * callers number
won=1 # set the won flag
if allboards == 0: # if this is the last remaining board
print("Last: ",int(num)*int(total))
exit(0)```