You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
1.4 KiB
43 lines
1.4 KiB
data = open("input.txt", 'r').read().split("\n\n")
|
|
seeds = [int(i) for i in data[0][7:].split()]
|
|
maps = [[[int(i) for i in numb.split()] for numb in block.splitlines()[1:]] for block in data[1:]]
|
|
#[destinationStart, sourceStart, length]
|
|
|
|
seeds2 = []
|
|
#[(start, end)]
|
|
for i in range(0, len(seeds), 2):
|
|
seeds2.append((seeds[i], seeds[i]+seeds[i+1]-1))
|
|
|
|
for m in maps:
|
|
newSeeds = list(seeds)
|
|
newSeeds2 = list()
|
|
for target, source, length in m:
|
|
for i in range(len(seeds)):
|
|
seed = seeds[i]
|
|
if seed in range(source, source+length):
|
|
newSeeds[i] = seed + (target - source)
|
|
|
|
while seeds2:
|
|
rangeStart, rangeEnd = seeds2.pop()
|
|
for r, mapStart, length in m:
|
|
mapEnd = mapStart + length -1
|
|
delta = r - mapStart
|
|
if mapEnd < rangeStart or mapStart > rangeEnd:
|
|
continue
|
|
if rangeStart < mapStart:
|
|
seeds2.append((rangeStart, mapStart - 1))
|
|
rangeStart = mapStart
|
|
if rangeStart < mapStart:
|
|
seeds2.append((rangeStart, mapStart - 1))
|
|
rangeStart = mapStart
|
|
newSeeds2.append((rangeStart + delta, rangeEnd + delta))
|
|
break
|
|
else:
|
|
newSeeds2.append((rangeStart, rangeEnd))
|
|
|
|
|
|
seeds = newSeeds
|
|
seeds2 = newSeeds2
|
|
|
|
print(min(newSeeds))
|
|
print(min(seeds2)[0]) |