-
Notifications
You must be signed in to change notification settings - Fork 0
/
day04.coconut
60 lines (54 loc) · 1.67 KB
/
day04.coconut
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
with open('./inputs/day4.txt') as infile:
calls = infile.readline().strip().split(',') |> map$(int) |> list
infile.readline()
lines = infile.readlines()
boards = []
board = []
for line in lines:
if len(line.strip()) == 0:
boards.append(board)
board = []
else:
board.append(line.strip().split() |> map$(int) |> list)
# last board
boards.append(board)
board_indexes = []
for board in boards:
board_index = {}
for y, row in enumerate(board):
for x, el in enumerate(row):
board_index[el] = (y, x)
board_indexes.append(board_index)
board_marks = [set() for _ in boards]
board_row_marked = [[0] * len(board) for board in boards]
board_col_marked = [[0] * len(board[0]) for board in boards]
boards_left = len(boards)
boards_win = [False for _ in boards]
part1_ans = None
part2_ans = None
while boards_left > 0:
call = calls.pop(0)
for i, board in enumerate(boards):
if boards_win[i]:
continue
if call in board_indexes[i]:
y, x = board_indexes[i][call]
if (y, x) not in board_marks[i]:
board_marks[i].add((y, x))
board_row_marked[i][y] += 1
board_col_marked[i][x] += 1
if board_row_marked[i][y] == 5 or board_col_marked[i][x] == 5:
# win
boards_left -= 1
boards_win[i] = True
sum_unmarked = 0
for r, row in enumerate(board):
for c, col in enumerate(row):
if (r, c) not in board_marks[i]:
sum_unmarked += col
score = sum_unmarked * call
if part1_ans is None:
part1_ans = score
part2_ans = score
print(f'part 1 = {part1_ans}')
print(f'part 2 = {part2_ans}')