33 lines
1.0 KiB
Python
33 lines
1.0 KiB
Python
import numpy as np
|
|
|
|
def read_inventory(filename: str):
|
|
# Read file as list of strings
|
|
with open(filename, "r") as fp:
|
|
data = fp.read().splitlines()
|
|
|
|
# Split on the empty line to separate ranges and items
|
|
splitpoint = data.index("")
|
|
ranges, items = data[:splitpoint], data[splitpoint + 1:]
|
|
|
|
return np.array([ran.split("-") for ran in ranges], dtype=int), np.array(items, dtype=int)
|
|
|
|
def is_fresh(ranges, item):
|
|
mins = ranges[:,0]
|
|
maxs = ranges[:,1]
|
|
return np.any((mins <= item)*(item <= maxs))
|
|
|
|
def count_fresh_items(ranges, items):
|
|
return sum([is_fresh(ranges, item) for item in items])
|
|
|
|
if __name__ == "__main__":
|
|
test_ranges, test_items = read_inventory("testinput")
|
|
# for item in test_items:
|
|
# print(is_fresh(item, test_ranges))
|
|
assert count_fresh_items(test_ranges, test_items) == 3
|
|
|
|
test_freshes = [False, True, False, True, True, False]
|
|
for idx, item in enumerate(test_items):
|
|
assert is_fresh(test_ranges, item) == test_freshes[idx]
|
|
|
|
ranges, items = read_inventory("input")
|
|
print(count_fresh_items(ranges, items)) |