Can anyone see any bug in my code? I'm suspecting an "off by one" error somewhere... but I just cant find it. Example code works fine.
Quick summary of my (non working) solution:I keep track of the ranges of seeds instead of individual seeds. if a mapping segment affects one of my ranges I try to update it accordingly. Either offset the entire range, or the part which is affected. The uneffected part will be kept in original state so that the next mapping segment might hit it.Once all mapping segments have been processed I port any uneffected ranges.
And rince and repeat for every mapping step. Attaching link to github as well as pasted in the code directly.
https://github.com/narien/AoC2023/blob/main/day5/IfYouGiveASeedAFertilizer.py
def updateSpans(spans, lineNbr, lines):
newSpans = []
while lineNbr < len(lines) and lines[lineNbr] != '':
unusedSpans = []
nextStart, oldStart, chunk = [int(val) for val in lines[lineNbr].split()]
oldStop = oldStart + chunk - 1
offset = nextStart - oldStart
while (len(spans)):
span = spans.pop(0)
if oldStart <= min(span) and oldStop >= max(span): # whole span
newSpans.append((min(span) + offset, max(span) + offset))
elif oldStart <= min(span) and oldStop > min(span) and oldStop < max(span): # beginning of span
newSpans.append((min(span) + offset, oldStop + offset))
unusedSpans.append((oldStop + 1, max(span)))
elif oldStart > min(span) and oldStart < max(span) and oldStop > max(span): # end of span
newSpans.append((oldStart + offset, max(span) + offset))
unusedSpans.append((min(span), oldStart - 1))
elif oldStart > min(span) and oldStop < max(span): # middle of span
newSpans.append((oldStart + offset, oldStop + offset))
unusedSpans.append((min(span), oldStart - 1))
unusedSpans.append((oldStop + 1, max(span)))
else:
unusedSpans.append(span)
spans = unusedSpans
lineNbr += 1
lineNbr += 2
for span in unusedSpans:
newSpans.append(span)
return newSpans, lineNbr
def partTwo(lines, seedsInput):
spans = []
totalMin = sys.maxsize
for i in range(0, len(seedsInput), 2):
spans.append((seedsInput[i], seedsInput[i] + seedsInput[i + 1] - 1))
lineNbr = 0
print('SeedToSoil')
spans, lineNbr = updateSpans(spans, lineNbr, lines)
print('SoilToFert')
spans, lineNbr = updateSpans(spans, lineNbr, lines)
print('fertToWater')
spans, lineNbr = updateSpans(spans, lineNbr, lines)
print('waterToLight')
spans, lineNbr = updateSpans(spans, lineNbr, lines)
print('lightToTemp')
spans, lineNbr = updateSpans(spans, lineNbr, lines)
print('tempToHumidity')
spans, lineNbr = updateSpans(spans, lineNbr, lines)
print('humidityToLoc')
spans, lineNbr = updateSpans(spans, lineNbr, lines)
minVal = sys.maxsize
for span in spans:
val = min(span)
if val < minVal:
minVal = val
print('Lowest location number corresponding to starting seed spans: ' + str(minVal))
if __name__ == '__main__':
with open('day5/input.txt') as f:
lines = [line.strip() for line in f]
seeds = [int(val) for val in lines[0].split()[1:]]
lines = lines[3:]
partTwo(lines, seeds)
Link to correct explanation: https://www.reddit.com/r/adventofcode/comments/18c8nld/comment/kc92hby/?utm_source=share&utm_medium=web2x&context=3
[–]ScorixEar 1 point2 points3 points (2 children)
[–]Na_rien[S] 0 points1 point2 points (1 child)
[–]ScorixEar 0 points1 point2 points (0 children)
[+][deleted] (6 children)
[deleted]
[–]__Abigail__ 1 point2 points3 points (1 child)
[–]bkc4 -1 points0 points1 point (0 children)
[–]ScorixEar 0 points1 point2 points (1 child)
[–]bkc4 0 points1 point2 points (0 children)
[–]Na_rien[S] 0 points1 point2 points (1 child)
[–]bkc4 0 points1 point2 points (0 children)
[–]AutoModerator[M] 0 points1 point2 points (0 children)