1+ #!/usr/bin/env python
2+ # -*- coding: utf-8 -*-
3+
4+ split_data = '\n \n '
5+ completed = True
6+ raw_data = None # Not To be touched
7+
8+ def part1 (data ):
9+ fresh_ranges = data [0 ].split ('\n ' )
10+ fresh_ranges = [[int (r ) for r in x .split ('-' )] for x in fresh_ranges ]
11+ ingredient_ids = [int (ing_id ) for ing_id in data [1 ].split ('\n ' )]
12+
13+ return sum (any (r [0 ] <= ing_id <= r [1 ] for r in fresh_ranges ) for ing_id in ingredient_ids )
14+
15+ def part2 (data ):
16+ fresh_ranges = data [0 ].split ('\n ' )
17+ fresh_ranges = [[int (r ) for r in x .split ('-' )] for x in fresh_ranges ]
18+
19+ evolved = True
20+ new_ranges = []
21+ while evolved :
22+ # print(fresh_ranges)
23+ for r1l , r1h in fresh_ranges :
24+ for i in range (len (new_ranges )):
25+ r2l , r2h = new_ranges [i ]
26+ # Check for intersection...
27+ if (r1l <= r2l <= r1h ) or (r1l <= r2h <= r1h ) or (r2l <= r1l <= r2h ) or (r2l <= r1h <= r2h ):
28+ new_ranges [i ] = [min (r1l , r2l ), max (r1h , r2h )]
29+ break
30+ else :
31+ new_ranges .append ([r1l , r1h ])
32+
33+ evolved = len (new_ranges ) != len (fresh_ranges )
34+ fresh_ranges = new_ranges
35+ new_ranges = []
36+
37+ # # We can run an assertation check...
38+ # for i1 in range(len(fresh_ranges)):
39+ # for i2 in range(i1 + 1, len(fresh_ranges)):
40+ # r1l, r1h = fresh_ranges[i1]
41+ # r2l, r2h = fresh_ranges[i2]
42+ # assert not ((r1l <= r2l <= r1h) or (r1l <= r2h <= r1h)), f"{fresh_ranges[i1]}, {fresh_ranges[i2]}"
43+
44+ return sum ((r [1 ] + 1 - r [0 ]) for r in fresh_ranges )
0 commit comments