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))