Noëlle 3 роки тому
джерело
коміт
8375e81bfa
Не вдалося знайти GPG ключ що відповідає даному підпису
2 змінених файлів з 159 додано та 0 видалено
  1. 77
    0
      aoc4-1.py
  2. 82
    0
      aoc4-2.py

+ 77
- 0
aoc4-1.py Переглянути файл

@@ -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)

+ 82
- 0
aoc4-2.py Переглянути файл

@@ -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)

Завантаження…
Відмінити
Зберегти