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) | |||||
for i, board in enumerate(boards): | |||||
board.mark(el) | |||||
if board.check(): | |||||
return (board, int(el) * board.sum_unmarked()) | |||||
if __name__ == "__main__": | |||||
board, total = main() | |||||
print(board) | |||||
print(total) |
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) |