From 9de28ee17932d949a12381bf5a8de95b5ea7332b Mon Sep 17 00:00:00 2001 From: Tomasz Kramkowski Date: Sat, 4 Dec 2021 13:37:42 +0000 Subject: day 4: use a set of nums before list.index --- 4.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/4.py b/4.py index 11b7382..f08659b 100644 --- a/4.py +++ b/4.py @@ -9,6 +9,7 @@ class Board: row_hits: list[int] has_bingo: bool unmarked_sum: int + nums: set[int] def __init__(self, cells: list[list[int]]): self.width = len(cells[0]) self.height = len(cells) @@ -16,22 +17,22 @@ class Board: self.row_hits = [0] * self.height self.unmarked_sum = 0 self.cells = [] + self.nums = set() for cell in chain.from_iterable(cells): self.unmarked_sum += cell self.cells.append(cell) + self.nums.add(cell) self.has_bingo = False def call(self, num: int): - try: - pos: int = self.cells.index(num) - self.col_hits[pos // self.width] += 1 - self.row_hits[pos // self.height] += 1 - self.unmarked_sum -= num - self.has_bingo = ( - any(hits == self.height for hits in self.col_hits) or - any(hits == self.width for hits in self.row_hits) - ) - except ValueError: - pass + if num not in self.nums: return + pos: int = self.cells.index(num) + self.col_hits[pos // self.width] += 1 + self.row_hits[pos // self.height] += 1 + self.unmarked_sum -= num + self.has_bingo = ( + any(hits == self.height for hits in self.col_hits) or + any(hits == self.width for hits in self.row_hits) + ) @staticmethod def from_string(s: str) -> 'Board': return Board([[int(n) for n in l.split()] for l in s.split('\n')]) -- cgit v1.2.3-54-g00ecf