@@ -0,0 +1,77 @@ | |||
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) |
@@ -0,0 +1,82 @@ | |||
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) |