You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
2.7 KiB
Go

package day5
import (
"fmt"
"math"
"strings"
"sync"
"gitea.paas.celticinfo.fr/oabrivard/aoc2023/utils"
)
type SrcToDest struct {
src int64
dst int64
rng int64
}
func buildMapList(start int, lines []string) ([]*SrcToDest, int) {
result := []*SrcToDest{}
for i := start + 1; len(strings.TrimSpace(lines[i])) > 0; i++ {
vals := utils.ParseInt64Array(lines[i], " ")
result = append(result, &SrcToDest{
src: vals[1],
dst: vals[0],
rng: vals[2],
})
}
/*
sort.SliceStable(result, func(i, j int) bool {
return result[i].src < result[j].src
})
*/
return result, start + len(result) + 2
}
func srcToDest(src int64, stdList []*SrcToDest) int64 {
for _, std := range stdList {
if std.src <= src && src <= std.src+std.rng-1 {
return src + std.dst - std.src
}
}
return src
}
func FindClosestLocation(lines []string) int64 {
seeds := utils.ParseInt64Array(strings.TrimPrefix(lines[0], "seeds: "), " ")
seedToSoil, i := buildMapList(2, lines)
soilToFert, i := buildMapList(i, lines)
fertToWater, i := buildMapList(i, lines)
waterToLight, i := buildMapList(i, lines)
lightToTemp, i := buildMapList(i, lines)
tempToHumid, i := buildMapList(i, lines)
humidToLoc, _ := buildMapList(i, lines)
result := int64(math.MaxInt64)
for _, seed := range seeds {
d1 := srcToDest(seed, seedToSoil)
d2 := srcToDest(d1, soilToFert)
d3 := srcToDest(d2, fertToWater)
d4 := srcToDest(d3, waterToLight)
d5 := srcToDest(d4, lightToTemp)
d6 := srcToDest(d5, tempToHumid)
d7 := srcToDest(d6, humidToLoc)
if d7 < result {
result = d7
}
}
return result
}
func FindRangedClosestLocation(lines []string) int64 {
seeds := utils.ParseInt64Array(strings.TrimPrefix(lines[0], "seeds: "), " ")
seedToSoil, i := buildMapList(2, lines)
soilToFert, i := buildMapList(i, lines)
fertToWater, i := buildMapList(i, lines)
waterToLight, i := buildMapList(i, lines)
lightToTemp, i := buildMapList(i, lines)
tempToHumid, i := buildMapList(i, lines)
humidToLoc, _ := buildMapList(i, lines)
var wg sync.WaitGroup
ch := make(chan int64, len(seeds)/2)
for i := 0; i < len(seeds); i += 2 {
wg.Add(1)
go func(s int64, r int64) {
defer wg.Done()
result := int64(math.MaxInt64)
for seed := s; seed < s+r; seed++ {
d1 := srcToDest(seed, seedToSoil)
d2 := srcToDest(d1, soilToFert)
d3 := srcToDest(d2, fertToWater)
d4 := srcToDest(d3, waterToLight)
d5 := srcToDest(d4, lightToTemp)
d6 := srcToDest(d5, tempToHumid)
d7 := srcToDest(d6, humidToLoc)
if d7 < result {
result = d7
}
}
fmt.Println("seed roots done:", result)
ch <- result
}(seeds[i], seeds[i+1])
}
wg.Wait()
close(ch)
result := int64(math.MaxInt64)
for i := range ch {
if i < result {
result = i
}
}
return result
}