day05
parent
e7805f5169
commit
accbdf81a9
|
|
@ -0,0 +1,41 @@
|
|||
|
||||
def item_in_range(item, id_range):
|
||||
start = id_range[0]
|
||||
end = id_range[1]
|
||||
return start <= item <= end
|
||||
|
||||
def check_item(item, id_ranges):
|
||||
for id_range in id_ranges:
|
||||
if item_in_range(item, id_range):
|
||||
return True
|
||||
return False
|
||||
|
||||
def read_input(filename):
|
||||
id_ranges = []
|
||||
inventory = []
|
||||
|
||||
read_range = True
|
||||
for line in open(filename).read().splitlines():
|
||||
|
||||
if line == "":
|
||||
read_range = False
|
||||
continue
|
||||
|
||||
if read_range:
|
||||
id_range = line.split("-")
|
||||
id_ranges.append((int(id_range[0]),int(id_range[1])))
|
||||
else:
|
||||
inventory.append(int(line))
|
||||
|
||||
return id_ranges, inventory
|
||||
|
||||
# filename = "day05/example_input" # 3
|
||||
filename = "day05/input" # 679
|
||||
id_ranges, inventory = read_input(filename)
|
||||
|
||||
counter = 0
|
||||
for item in inventory:
|
||||
if check_item(item, id_ranges):
|
||||
counter += 1
|
||||
|
||||
print(f"Fresh items: {counter}")
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
def item_in_range(item, id_range):
|
||||
start = id_range[0]
|
||||
end = id_range[1]
|
||||
return start <= item <= end
|
||||
|
||||
def squash_ranges(id_ranges):
|
||||
|
||||
while True:
|
||||
id_ranges_size = len(id_ranges)
|
||||
|
||||
squash_range = []
|
||||
|
||||
squash_range.append(id_ranges[0].copy())
|
||||
for checker in id_ranges:
|
||||
|
||||
overlap = False
|
||||
for candidate in squash_range:
|
||||
# Squash if checker min within candidate range or otherway around
|
||||
if item_in_range(checker[0], candidate) or item_in_range(candidate[0], checker):
|
||||
overlap = True
|
||||
candidate[0] = min(checker[0],candidate[0])
|
||||
candidate[1] = max(checker[1],candidate[1])
|
||||
|
||||
if not overlap:
|
||||
squash_range.append(checker.copy())
|
||||
|
||||
id_ranges = squash_range.copy()
|
||||
|
||||
if id_ranges_size == len(id_ranges):
|
||||
# If no changes, break
|
||||
break
|
||||
return id_ranges
|
||||
|
||||
|
||||
|
||||
def read_input(filename):
|
||||
id_ranges = []
|
||||
|
||||
for line in open(filename).read().splitlines():
|
||||
|
||||
if line == "":
|
||||
return id_ranges
|
||||
|
||||
id_range = line.split("-")
|
||||
id_ranges.append([int(id_range[0]),int(id_range[1])])
|
||||
|
||||
# filename = "day05/my_example_input"
|
||||
# filename = "day05/example_input" # 14
|
||||
filename = "day05/input" # 358155203664116
|
||||
|
||||
id_ranges = read_input(filename)
|
||||
|
||||
id_ranges = squash_ranges(id_ranges)
|
||||
|
||||
counter = 0
|
||||
for id_range in id_ranges:
|
||||
counter += (id_range[1] - id_range[0]) + 1 # ranges are inclusive...
|
||||
|
||||
|
||||
print(f"Fresh items: {counter}")
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
3-5
|
||||
10-14
|
||||
16-20
|
||||
12-18
|
||||
|
||||
1
|
||||
5
|
||||
8
|
||||
11
|
||||
17
|
||||
32
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,12 @@
|
|||
17-19
|
||||
3-5
|
||||
10-14
|
||||
16-20
|
||||
12-18
|
||||
|
||||
1
|
||||
5
|
||||
8
|
||||
11
|
||||
17
|
||||
32
|
||||
Loading…
Reference in New Issue