Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def day5(s, *, part2=False, unoptimized_part1=False):
- s_intervals, s_indices = s.split('\n\n')
- input_intervals = []
- for line in s_intervals.splitlines():
- start, end = map(int, line.split('-'))
- input_intervals.append((start, end + 1))
- indices = list(map(int, s_indices.splitlines()))
- # Sort the intervals and merge adjacent or overlapping intervals.
- intervals = []
- for start, stop in sorted(input_intervals):
- if not intervals or start > intervals[-1][1]:
- intervals.append((start, stop))
- elif stop > intervals[-1][1]:
- intervals[-1] = intervals[-1][0], stop
- if part2:
- return sum(stop - start for start, stop in intervals)
- if unoptimized_part1:
- return sum(any(start <= index < stop for start, stop in intervals) for index in indices)
- # Optimized Part 1.
- count = 0
- for index in indices:
- i = bisect.bisect_left(intervals, index, key=lambda interval: interval[0])
- if i > 0:
- start, stop = intervals[i - 1]
- count += start <= index < stop
- return count
Advertisement
Add Comment
Please, Sign In to add comment