Day 4
This commit is contained in:
parent
b453b3a4a1
commit
6602b060ea
77
2021/day4.py
Normal file
77
2021/day4.py
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
lines = [line.rstrip() for line in sys.stdin]
|
||||||
|
pack = list(map(int, lines[0].split(",")))
|
||||||
|
boards = []
|
||||||
|
for i in range(2, len(lines), 6):
|
||||||
|
boards.append([
|
||||||
|
list(map(int, filter(bool, line.split())))
|
||||||
|
for line in lines[i:i+5]
|
||||||
|
])
|
||||||
|
|
||||||
|
# Part 1
|
||||||
|
find_winner(boards, pack)
|
||||||
|
|
||||||
|
# Part 2
|
||||||
|
not_won_yet = [1] * len(boards)
|
||||||
|
iterpack = iter(pack) # just so we can avoid looping twice
|
||||||
|
for n in iterpack:
|
||||||
|
for b, board in enumerate(boards):
|
||||||
|
board_marked = False
|
||||||
|
for x, row in enumerate(board):
|
||||||
|
for y, num in enumerate(row):
|
||||||
|
if num == n:
|
||||||
|
board[x][y] = -1
|
||||||
|
board_marked = True
|
||||||
|
break
|
||||||
|
if board_marked:
|
||||||
|
break
|
||||||
|
if get_unmarked_sum_if_winning(board) is not None:
|
||||||
|
not_won_yet[b] = 0
|
||||||
|
if sum(not_won_yet) == 1:
|
||||||
|
print("We have a loser...")
|
||||||
|
ib = not_won_yet.index(1)
|
||||||
|
find_winner([boards[ib]], iterpack)
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
def find_winner(boards, pack):
|
||||||
|
won = False
|
||||||
|
for n in pack:
|
||||||
|
for board in boards:
|
||||||
|
board_marked = False
|
||||||
|
for x, row in enumerate(board):
|
||||||
|
for y, num in enumerate(row):
|
||||||
|
if num == n:
|
||||||
|
board[x][y] = -1
|
||||||
|
board_marked = True
|
||||||
|
break
|
||||||
|
if board_marked:
|
||||||
|
break
|
||||||
|
if unmarked_sum := get_unmarked_sum_if_winning(board):
|
||||||
|
score = unmarked_sum * n
|
||||||
|
print("We have a winner!", score)
|
||||||
|
won = True
|
||||||
|
break
|
||||||
|
if won:
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
def get_unmarked_sum_if_winning(board):
|
||||||
|
for row in board:
|
||||||
|
if row == [-1, -1, -1, -1, -1]:
|
||||||
|
return get_unmarked_sum(board)
|
||||||
|
for col in range(len(board)):
|
||||||
|
if all(row[col] == -1 for row in board):
|
||||||
|
return get_unmarked_sum(board)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_unmarked_sum(board):
|
||||||
|
return sum(n for row in board for n in row if n != -1)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in a new issue