89 lines
2.1 KiB
Python
Executable File
89 lines
2.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import sys, utils
|
|
|
|
class Board(object):
|
|
def __init__(self, l):
|
|
self.board = []
|
|
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):
|
|
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:
|
|
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 process(l):
|
|
nums = get_numbers(l)
|
|
boards = init_boards(l)
|
|
return solve(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))
|
|
|
|
|
|
|