diff --git a/day5/dayFive.go b/day5/dayFive.go index bb64591..e6fa38c 100644 --- a/day5/dayFive.go +++ b/day5/dayFive.go @@ -5,6 +5,7 @@ import ( "log" "math" "os" + "sort" "strconv" "strings" ) @@ -48,7 +49,7 @@ func applyMap(source int, mapping map[int]int) int { } func (a Almanach)locationForSeed(seed int) int { - log.Print("starting calc of location for seed %d", seed) + // log.Print("starting calc of location for seed %n", seed) soil := a.SeedToSoil.applyMap(seed) fert := a.SoilToFert.applyMap(soil) water := a.FertToWater.applyMap(fert) @@ -105,17 +106,53 @@ func Run() int { result := math.MaxInt log.Print("before seed range") - for _, seed := range seeds { - log.Printf("checking for seed %d", seed) - location := almanach.locationForSeed(seed) - if location < result { - result = location + seedRanges := make([][]int, 0) + for i := 0; i < len(seeds)-1; i += 2 { + start := seeds[i] + seedRangeLen := seeds[i+1] + seedRanges = append(seedRanges, []int{start, start+seedRangeLen}) + } + + mergedSeedRanges := merge(seedRanges) + for _, seedRange := range mergedSeedRanges { + log.Printf("starting new range %+v. current min is %n", seedRange, result) + for i := seedRange[0]; i <= seedRange[1]; i++ { + location := almanach.locationForSeed(i) + if location < result { + result = location + } } } return result } +// copy from https://codereview.stackexchange.com/questions/259048/merge-intervalsgolang +func merge(intervals [][]int) [][]int { + const start, end = 0, 1 + + var merged [][]int + + if len(intervals) > 1 { + sort.Slice(intervals, func(i, j int) bool { + return intervals[i][start] < intervals[j][start] + }) + } + + for _, interval := range intervals { + last := len(merged) - 1 + if last < 0 || interval[start] > merged[last][end] { + merged = append(merged, + []int{start: interval[start], end: interval[end]}, + ) + } else if interval[end] > merged[last][end] { + merged[last][end] = interval[end] + } + } + + return merged[:len(merged):len(merged)] +} + func ReadMap(filename string) EfficientMap { log.Printf("reading in map from %s", filename) result := make([]Triplet, 0)