50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
|
|
import itertools
|
||
|
|
import re
|
||
|
|
from collections import defaultdict
|
||
|
|
|
||
|
|
from solutions import BaseSolution
|
||
|
|
|
||
|
|
|
||
|
|
class Solution(BaseSolution):
|
||
|
|
input_file = '03.in'
|
||
|
|
|
||
|
|
claim_pattern = re.compile(r'#(\d+) @ (\d+),(\d+): (\d+)x(\d+)')
|
||
|
|
|
||
|
|
def __str__(self):
|
||
|
|
return 'Day 3: No Matter How You Slice It'
|
||
|
|
|
||
|
|
def solve(self, puzzle_input):
|
||
|
|
claims = self.get_claims(puzzle_input)
|
||
|
|
return sum(map(lambda c: c[1] > 1, claims.items()))
|
||
|
|
|
||
|
|
def solve_again(self, puzzle_input):
|
||
|
|
claims = self.get_claims(puzzle_input)
|
||
|
|
non_repeated_id = self._find_nri(puzzle_input, claims)
|
||
|
|
return non_repeated_id
|
||
|
|
|
||
|
|
def parse_claim(self, data):
|
||
|
|
return tuple(map(int, self.claim_pattern.search(data).groups()))
|
||
|
|
|
||
|
|
def get_claims(self, puzzle_input):
|
||
|
|
claims = defaultdict(int)
|
||
|
|
for line in puzzle_input.splitlines():
|
||
|
|
_, left, top, width, height = self.parse_claim(line)
|
||
|
|
for w, h in itertools.product(range(left, left + width), range(top, top + height)):
|
||
|
|
claims[(w, h)] += 1
|
||
|
|
return claims
|
||
|
|
|
||
|
|
def _find_nri(self, puzzle_input, claims):
|
||
|
|
for line in puzzle_input.splitlines():
|
||
|
|
repeated = False
|
||
|
|
cid, left, top, width, height = self.parse_claim(line)
|
||
|
|
for w, h in itertools.product(range(left, left + width), range(top, top + height)):
|
||
|
|
if claims[(w, h)] > 1:
|
||
|
|
repeated = True
|
||
|
|
if not repeated:
|
||
|
|
return cid
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
solution = Solution()
|
||
|
|
solution.show_results()
|