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

1from typing import List, Tuple 

2 

3from src.aoc2022.utils import get_raw_data 

4 

5row_type = Tuple[int, int, int, int] 

6 

7 

8def parse_data_to_array(raw_data: str) -> List[row_type]: 

9 """ 

10 Parses the raw text input into lists of value tuples 

11 

12 :param raw_data: Raw text data to be parsed 

13 :type raw_data: str 

14 

15 :return: Parsed list of value tuples 

16 :rtype: List[Tuple[int]] 

17 """ 

18 lines = raw_data.replace(" ", "").strip().split("\n") 

19 

20 parsed_data = [] 

21 for line in lines: 

22 

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("-")] 

26 

27 parsed_data.append((first_start, first_end, second_start, second_end)) 

28 

29 return parsed_data 

30 

31 

32def set_contains_other_set(ranges: row_type) -> bool: 

33 """ 

34 check whether one of the ranges in entirely contained by the other 

35 

36 :param ranges: tuple of (start_left, end_left, start_right, end_right) 

37 :type ranges: Tuple[int] 

38 

39 :return: flag whether if one set is a subset of the other 

40 :rtype: bool 

41 """ 

42 

43 left_start, left_end, right_start, right_end = ranges 

44 

45 min_cardinality = min(left_end - left_start, right_end - right_start) 

46 

47 start = max(left_start, right_start) 

48 end = min(left_end, right_end) 

49 

50 return (end - start) == min_cardinality 

51 

52 

53def set_overlaps(ranges: row_type) -> bool: 

54 """ 

55 check whether the sets overlap at all 

56 

57 :param ranges: tuple of (start_left, end_left, start_right, end_right) 

58 :type ranges: Tuple[int] 

59 

60 :return: flag whether the sets overlap 

61 :rtype: bool 

62 """ 

63 

64 left_start, left_end, right_start, right_end = ranges 

65 

66 start = max(left_start, right_start) 

67 end = min(left_end, right_end) 

68 

69 return (end - start) >= 0 

70 

71 

72if __name__ == "__main__": # pragma: no cover 

73 data = get_raw_data("./src/aoc2022/data/day4.txt") 

74 parsed_data = parse_data_to_array(data) 

75 

76 containing_sets = [set_contains_other_set(sets) for sets in parsed_data] 

77 containing_count = sum(containing_sets) 

78 

79 print(f"{containing_count} pairs have a set contained by the other.") 

80 

81 overlapping_sets = [set_overlaps(sets) for sets in parsed_data] 

82 overlapping_count = sum(overlapping_sets) 

83 

84 print(f"{overlapping_count} pairs overlap.")