2025(05): part 2 be solved
This commit is contained in:
47
2025/05/part2.py
Normal file
47
2025/05/part2.py
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import numpy as np
|
||||||
|
from part1 import read_inventory
|
||||||
|
|
||||||
|
def get_disjunct_ranges(ranges):
|
||||||
|
our_ranges = ranges.copy()
|
||||||
|
changed = True
|
||||||
|
|
||||||
|
while changed:
|
||||||
|
changed = False
|
||||||
|
for i in range(len(our_ranges)):
|
||||||
|
a, b = our_ranges[i]
|
||||||
|
for j in range(i + 1, len(our_ranges)):
|
||||||
|
c, d = our_ranges[j]
|
||||||
|
if c < a and a <= d and d <= b:
|
||||||
|
our_ranges[i] = np.array([c, b])
|
||||||
|
our_ranges = np.delete(our_ranges, j, 0)
|
||||||
|
changed = True
|
||||||
|
break
|
||||||
|
elif c < a and b < d:
|
||||||
|
our_ranges[i] = np.array([c, d])
|
||||||
|
our_ranges = np.delete(our_ranges, j, 0)
|
||||||
|
changed = True
|
||||||
|
break
|
||||||
|
elif a <= c and c <= b and a <= d and d <= b:
|
||||||
|
our_ranges[i] = np.array([a, b])
|
||||||
|
our_ranges = np.delete(our_ranges, j, 0)
|
||||||
|
changed = True
|
||||||
|
break
|
||||||
|
elif a <= c and c <= b and b < d:
|
||||||
|
our_ranges[i] = np.array([a, d])
|
||||||
|
our_ranges = np.delete(our_ranges, j, 0)
|
||||||
|
changed = True
|
||||||
|
break
|
||||||
|
if changed:
|
||||||
|
break
|
||||||
|
return our_ranges
|
||||||
|
|
||||||
|
def get_fresh_id_counts(ranges):
|
||||||
|
disjunct_ranges = get_disjunct_ranges(ranges)
|
||||||
|
return np.sum(disjunct_ranges[:,1] - disjunct_ranges[:,0]) + len(disjunct_ranges)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
test_ranges, test_items = read_inventory("testinput")
|
||||||
|
assert get_fresh_id_counts(test_ranges) == 14
|
||||||
|
|
||||||
|
ranges, items = read_inventory("input")
|
||||||
|
print(get_fresh_id_counts(ranges))
|
||||||
Reference in New Issue
Block a user