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
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
|
|
}
|