/
day4.py
85 lines (76 loc) · 2.34 KB
/
day4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
with open('day4input.txt') as f:
lines = f.read().splitlines()
calls = lines[0].split(',')
boards = {}
i = 0
for line in lines[2:]:
numbers = line.split()
if len(numbers) == 0:
continue
board = i//5
i += 1
if board in boards:
boards[board].append(numbers)
else:
boards[board] = [numbers]
def checkRow(board):
for row in range(len(board)):
sum = 0
for col in range(len(board[0])):
sum += int(board[row][col])
if sum == -5:
return True
return False
def checkCol(board):
for col in range(len(board[0])):
sum = 0
for row in range(len(board)):
sum += int(board[row][col])
if sum == -5:
return True
return False
def checkWinner(call):
for i, board in boards.items():
# Don't check winning if the board has already won
if i in winningBoards:
continue
if checkRow(board) or checkCol(board):
winningBoards.append(i)
winningBoardsWithCalls.append((i, call, board))
def markNumber(board, number):
for row in range(len(board)):
for col in range(len(board[0])):
if board[row][col] == number:
board[row][col] = -1
# Number found, just return because number is unique in Bingo board
return
winningBoards = []
winningBoardsWithCalls = []
def solve(part):
for call in calls:
for i, board in boards.items():
# Skip winning boards
if i in winningBoards:
continue
markNumber(board, call)
checkWinner(call)
if part == 1 and len(winningBoards) > 0:
return
solve(1)
board = winningBoardsWithCalls[-1][2]
winningNumber = int(winningBoardsWithCalls[-1][1])
unmarkedTotal = 0
for row in range(len(board)):
for col in range(len(board[0])):
if board[row][col] != -1:
unmarkedTotal += int(board[row][col])
print("Part 1:", winningNumber * unmarkedTotal) # 27027
solve(2)
board = winningBoardsWithCalls[-1][2]
winningNumber = int(winningBoardsWithCalls[-1][1])
unmarkedTotal = 0
for row in range(len(board)):
for col in range(len(board[0])):
if board[row][col] != -1:
unmarkedTotal += int(board[row][col])
print("Part 2:", winningNumber * unmarkedTotal) # 36975