diff --git a/advent_of_code/2025(python)/day5.py b/advent_of_code/2025(python)/day5.py new file mode 100644 index 0000000..21d6b57 --- /dev/null +++ b/advent_of_code/2025(python)/day5.py @@ -0,0 +1,61 @@ + +def solve_day5_part1(input_): + + ranges = [] + cnt = 0 + + for line in input_: + if line.strip() == "": + merged_ranges = _merge_intervals(ranges) + continue + if "-" in line: + start, end = map(int, line.split("-")) + # Process range + ranges.append([start, end]) + else: + number = int(line) + # Process ingredients + for range in merged_ranges: + if range[0] <= number <= range[1]: + cnt += 1 + + return cnt + + +def _merge_intervals(intervals): + if not intervals: + return [] + + intervals.sort(key=lambda x: x[0]) + res = [intervals[0]] + prev_end = intervals[0][1] + for current in intervals[1:]: + # no overlap + if current[0] > prev_end: + res.append(current) + prev_end = current[1] + else: + # with overlap, choose maximum end as new end + res[-1][1] = max(prev_end, current[1]) + prev_end = res[-1][1] + return res + + +def solve_day5_part2(input_): + ranges = [] + cnt = 0 + + for line in input_: + + cnt = 0 + if "-" in line: + start, end = map(int, line.split("-")) + # Process range + ranges.append([start, end]) + + if line.strip() == "": + merged_ranges = _merge_intervals(ranges) + for range in merged_ranges: + cnt += (range[1]-range[0]+1) + + return cnt diff --git a/advent_of_code/2025(python)/test_day5.py b/advent_of_code/2025(python)/test_day5.py new file mode 100644 index 0000000..0af8151 --- /dev/null +++ b/advent_of_code/2025(python)/test_day5.py @@ -0,0 +1,30 @@ +import unittest + +from day5 import solve_day5_part1, solve_day5_part2 + +question_input = [ + "3-5", + "10-14", + "16-20", + "12-18", + "", + "1", + "5", + "8", + "11", + "17", + "32", +] + + +class TestSample(unittest.TestCase): + + def test_part1(self): + self.assertEqual(solve_day5_part1(question_input), 3) + + def test_part2(self): + self.assertEqual(solve_day5_part2(question_input), 14) + + +if __name__ == "__main__": + unittest.main()