From e126477ef5666cfebf49ae8416b11353fc4fea03 Mon Sep 17 00:00:00 2001 From: Thibaud Date: Mon, 28 Jul 2025 13:40:33 +0200 Subject: [PATCH] 2018 day 3 --- 2018/day3/day3.py | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 2018/day3/day3.py diff --git a/2018/day3/day3.py b/2018/day3/day3.py new file mode 100644 index 0000000..9989418 --- /dev/null +++ b/2018/day3/day3.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +import re +import itertools +from dataclasses import dataclass +from collections import defaultdict + + +@dataclass +class Rectangle: + x: int + y: int + width: int + height: int + + @property + def x2(self): + return self.x + self.width + + @property + def y2(self): + return self.y + self.height + + +def parse_line(l): + parsed = re.findall(r"\d+", l) + id_, x, y, width, height = map(int, parsed) + return id_, Rectangle(x, y, width, height) + + +def main(inp): + regions = defaultdict(set) + for id_, region in map(parse_line, inp): + for x in range(region.x, region.x2): + for y in range(region.y, region.y2): + regions[x, y].add(id_) + + total = sum(len(x) > 1 for x in regions.values()) + print(f"Part 1: ", total) + + all_ids = set() + overlapping_ids = set() + for region in regions.values(): + all_ids.update(region) + if len(region) > 1: + overlapping_ids.update(region) + difference = all_ids - overlapping_ids + print(f"Part 2: {difference.pop()}") + + +if __name__ == '__main__': + import sys + infile = sys.argv[1] if len(sys.argv) > 1 else "example.txt" + with open(infile) as inp: + main([l.rstrip() for l in inp.readlines()]) +