Coverage for src\aoc2022\days\day4.py: 100%
23 statements
« prev ^ index » next coverage.py v7.0.0, created at 2022-12-23 05:19 +0000
« prev ^ index » next coverage.py v7.0.0, created at 2022-12-23 05:19 +0000
1from typing import List, Tuple
3from src.aoc2022.utils import get_raw_data
5row_type = Tuple[int, int, int, int]
8def parse_data_to_array(raw_data: str) -> List[row_type]:
9 """
10 Parses the raw text input into lists of value tuples
12 :param raw_data: Raw text data to be parsed
13 :type raw_data: str
15 :return: Parsed list of value tuples
16 :rtype: List[Tuple[int]]
17 """
18 lines = raw_data.replace(" ", "").strip().split("\n")
20 parsed_data = []
21 for line in lines:
23 first_pair, second_pair = line.split(",")
24 first_start, first_end = [int(e) for e in first_pair.split("-")]
25 second_start, second_end = [int(e) for e in second_pair.split("-")]
27 parsed_data.append((first_start, first_end, second_start, second_end))
29 return parsed_data
32def set_contains_other_set(ranges: row_type) -> bool:
33 """
34 check whether one of the ranges in entirely contained by the other
36 :param ranges: tuple of (start_left, end_left, start_right, end_right)
37 :type ranges: Tuple[int]
39 :return: flag whether if one set is a subset of the other
40 :rtype: bool
41 """
43 left_start, left_end, right_start, right_end = ranges
45 min_cardinality = min(left_end - left_start, right_end - right_start)
47 start = max(left_start, right_start)
48 end = min(left_end, right_end)
50 return (end - start) == min_cardinality
53def set_overlaps(ranges: row_type) -> bool:
54 """
55 check whether the sets overlap at all
57 :param ranges: tuple of (start_left, end_left, start_right, end_right)
58 :type ranges: Tuple[int]
60 :return: flag whether the sets overlap
61 :rtype: bool
62 """
64 left_start, left_end, right_start, right_end = ranges
66 start = max(left_start, right_start)
67 end = min(left_end, right_end)
69 return (end - start) >= 0
72if __name__ == "__main__": # pragma: no cover
73 data = get_raw_data("./src/aoc2022/data/day4.txt")
74 parsed_data = parse_data_to_array(data)
76 containing_sets = [set_contains_other_set(sets) for sets in parsed_data]
77 containing_count = sum(containing_sets)
79 print(f"{containing_count} pairs have a set contained by the other.")
81 overlapping_sets = [set_overlaps(sets) for sets in parsed_data]
82 overlapping_count = sum(overlapping_sets)
84 print(f"{overlapping_count} pairs overlap.")