102 lines
2.4 KiB
Python
102 lines
2.4 KiB
Python
![]() |
#!/usr/bin/env python3
|
||
|
import sys, utils
|
||
|
|
||
|
class Board(object):
|
||
|
def __init__(self, l):
|
||
|
self.board = []
|
||
|
self.won = False
|
||
|
for row in l:
|
||
|
vals = [[int(v), False] for v in row.split()]
|
||
|
self.board.append(vals)
|
||
|
|
||
|
def __str__(self):
|
||
|
s = ''
|
||
|
for row in self.board:
|
||
|
s += "\t".join([str(n[0]) for n in row]) + '\n'
|
||
|
return s
|
||
|
|
||
|
def check(self, n):
|
||
|
if self.won:
|
||
|
return None
|
||
|
for i in range(len(self.board)):
|
||
|
for j in range(len(self.board[0])):
|
||
|
if self.board[i][j][0] == n:
|
||
|
self.board[i][j][1] = True
|
||
|
return self.has_winning_row() or self.has_winning_column()
|
||
|
|
||
|
def has_winning_row(self) -> list:
|
||
|
for row in self.board:
|
||
|
winning = True
|
||
|
for val in row:
|
||
|
if not val[1]:
|
||
|
winning = False
|
||
|
if winning:
|
||
|
return self.sum_unmarked()
|
||
|
return None
|
||
|
|
||
|
def has_winning_column(self) -> list:
|
||
|
for x in range(len(self.board[0])):
|
||
|
column = [row[x] for row in self.board]
|
||
|
winning = True
|
||
|
for val in column:
|
||
|
if not val[1]:
|
||
|
winning = False
|
||
|
if winning:
|
||
|
return self.sum_unmarked()
|
||
|
return None
|
||
|
|
||
|
def sum_unmarked(self) -> int:
|
||
|
self.won = True
|
||
|
total = 0
|
||
|
for row in self.board:
|
||
|
for value in row:
|
||
|
if not value[1]:
|
||
|
total += value[0]
|
||
|
return total
|
||
|
|
||
|
def get_numbers(l):
|
||
|
nums = [int(n) for n in l[0].split(',')]
|
||
|
return nums
|
||
|
|
||
|
def init_boards(l):
|
||
|
boards = []
|
||
|
for i in range(2, len(l)-4, 6):
|
||
|
b = Board(l[i:i+5])
|
||
|
boards.append(b)
|
||
|
return boards
|
||
|
|
||
|
def solve(boards, nums):
|
||
|
for n in nums:
|
||
|
for board in boards:
|
||
|
s = board.check(n)
|
||
|
if s:
|
||
|
return s * n
|
||
|
return "FUCK!"
|
||
|
|
||
|
def last_winning(boards, nums):
|
||
|
last = None
|
||
|
for n in nums:
|
||
|
for board in boards:
|
||
|
s = board.check(n)
|
||
|
if s:
|
||
|
last = s * n
|
||
|
return last
|
||
|
|
||
|
def process(l):
|
||
|
nums = get_numbers(l)
|
||
|
boards = init_boards(l)
|
||
|
return last_winning(boards, nums)
|
||
|
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
if len(sys.argv) < 2:
|
||
|
print("please supply input file")
|
||
|
sys.exit()
|
||
|
|
||
|
l = utils.File(sys.argv[1]).get_strings()
|
||
|
print(process(l))
|
||
|
|
||
|
|
||
|
|