|
|
|
|
|
|
|
|
|
|
|
class Board: |
|
|
|
|
|
def __init__(self, lines, boardsize=None, boardnum=None): |
|
|
|
|
|
self.lines = [[el for el in line.split(" ") if el != ""] for line in lines] |
|
|
|
|
|
self.boardsize = 5 if boardsize == None else boardsize |
|
|
|
|
|
self.boardnum = 0 if boardnum == None else boardnum |
|
|
|
|
|
self.marks = [] |
|
|
|
|
|
for _ in range(self.boardsize): |
|
|
|
|
|
self.marks.append([0]*self.boardsize) |
|
|
|
|
|
|
|
|
|
|
|
def mark(self, digit): |
|
|
|
|
|
import pdb |
|
|
|
|
|
# if self.boardnum == 1: |
|
|
|
|
|
# pdb.set_trace() |
|
|
|
|
|
for i, line in enumerate(self.lines): |
|
|
|
|
|
if digit in line: |
|
|
|
|
|
y = i |
|
|
|
|
|
x = line.index(digit) |
|
|
|
|
|
self.marks[y][x] = 1 |
|
|
|
|
|
return None |
|
|
|
|
|
|
|
|
|
|
|
def check(self): |
|
|
|
|
|
for line in self.marks: |
|
|
|
|
|
if sum(line) == 5: |
|
|
|
|
|
return True |
|
|
|
|
|
for i in range(5): |
|
|
|
|
|
if self.marks[0][i] == 1 and \ |
|
|
|
|
|
self.marks[1][i] == 1 and \ |
|
|
|
|
|
self.marks[2][i] == 1 and \ |
|
|
|
|
|
self.marks[3][i] == 1 and \ |
|
|
|
|
|
self.marks[4][i] == 1: |
|
|
|
|
|
return True |
|
|
|
|
|
return False |
|
|
|
|
|
|
|
|
|
|
|
def sum_unmarked(self): |
|
|
|
|
|
total = 0 |
|
|
|
|
|
for i in range(self.boardsize): |
|
|
|
|
|
for j in range(self.boardsize): |
|
|
|
|
|
if self.marks[j][i] == 0: |
|
|
|
|
|
total += int(self.lines[j][i]) |
|
|
|
|
|
return total |
|
|
|
|
|
|
|
|
|
|
|
def __repr__(self): |
|
|
|
|
|
outstr = f"Board {self.boardnum}:\n" |
|
|
|
|
|
for i in range(self.boardsize): |
|
|
|
|
|
outstr += f"{' '.join([str(el).rjust(2) for el in self.lines[i]])} {' '.join([str(el).rjust(2) for el in self.marks[i]])}\n" |
|
|
|
|
|
return outstr |
|
|
|
|
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
|
|
outstr = f"Board {self.boardnum}:\n" |
|
|
|
|
|
for i in range(self.boardsize): |
|
|
|
|
|
outstr += f"{' '.join([str(el).rjust(2) for el in self.lines[i]])} {' '.join([str(el).rjust(2) for el in self.marks[i]])}\n" |
|
|
|
|
|
return outstr |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def main(): |
|
|
|
|
|
with open("aoc4-1.txt", "r") as file: |
|
|
|
|
|
lines = [line.strip() for line in file.readlines()] |
|
|
|
|
|
firstline = lines[0].split(",") |
|
|
|
|
|
lines = lines[2:] |
|
|
|
|
|
i = 0 |
|
|
|
|
|
j = 0 |
|
|
|
|
|
boards = [] |
|
|
|
|
|
while i < len(lines): |
|
|
|
|
|
boards.append(Board(lines[i:i+5], boardnum=j)) |
|
|
|
|
|
j += 1 |
|
|
|
|
|
i += 6 |
|
|
|
|
|
for el in firstline: |
|
|
|
|
|
print(el) |
|
|
|
|
|
is_to_pop = [] |
|
|
|
|
|
for i, board in enumerate(boards): |
|
|
|
|
|
board.mark(el) |
|
|
|
|
|
if board.check(): |
|
|
|
|
|
if len(boards) > 1: |
|
|
|
|
|
is_to_pop.append(i) |
|
|
|
|
|
else: |
|
|
|
|
|
return (board, int(el) * board.sum_unmarked()) |
|
|
|
|
|
boards = [board for i, board in enumerate(boards) if i not in is_to_pop] |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
|
|
board, total = main() |
|
|
|
|
|
print(board) |
|
|
|
|
|
print(total) |