109 lines
2 KiB
Go
109 lines
2 KiB
Go
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"os"
|
||
|
"strings"
|
||
|
"strconv"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
reader := bufio.NewReader(os.Stdin);
|
||
|
|
||
|
text, _ := reader.ReadString('\n')
|
||
|
seeds := strings.Split(strings.Trim(strings.Split(text, ": ")[1], "\n"), " ");
|
||
|
|
||
|
reader.ReadString('\n')
|
||
|
mappers := [][]resMap{};
|
||
|
|
||
|
points := []int{};
|
||
|
|
||
|
for {
|
||
|
|
||
|
line, _ := reader.ReadString('\n')
|
||
|
if len(line) < 1 {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
mapper := []resMap{};
|
||
|
|
||
|
for {
|
||
|
nextLine, _ := reader.ReadString('\n');
|
||
|
seedToSoil := strings.Split(strings.Trim(nextLine, "\n"), " ");
|
||
|
if len(seedToSoil) != 3 {
|
||
|
break;
|
||
|
}
|
||
|
destStart, _ := strconv.Atoi(seedToSoil[0]);
|
||
|
srcStart, _ := strconv.Atoi(seedToSoil[1]);
|
||
|
length, _ := strconv.Atoi(seedToSoil[2]);
|
||
|
mapper = append(mapper, resMap{destStart,srcStart,length})
|
||
|
points = append(points, seedLocOrigin(mappers, srcStart));
|
||
|
}
|
||
|
|
||
|
mappers = append(mappers, mapper)
|
||
|
}
|
||
|
|
||
|
min := 0;
|
||
|
|
||
|
for i := 0; i < len(seeds) -1; i += 2 {
|
||
|
start, _ := strconv.Atoi(seeds[i]);
|
||
|
length, _ := strconv.Atoi(seeds[i+1]);
|
||
|
o := seedLoc(mappers, start);
|
||
|
if min == 0 || o < min {
|
||
|
min = o;
|
||
|
}
|
||
|
for _, point := range points {
|
||
|
if point > start && point < start + length {
|
||
|
|
||
|
o := seedLoc(mappers, point);
|
||
|
if min == 0 || o < min {
|
||
|
min = o;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
println(min)
|
||
|
}
|
||
|
|
||
|
func seedLoc(mappers [][]resMap, source int) int {
|
||
|
for _, m := range mappers {
|
||
|
source = mapSeed(m, source)
|
||
|
}
|
||
|
return source
|
||
|
}
|
||
|
|
||
|
func mapSeed(soil []resMap, source int) (int) {
|
||
|
for _, m := range soil {
|
||
|
if source >= m.srcStart && source < m.srcStart + m.length {
|
||
|
return m.destStart + (source - m.srcStart)
|
||
|
}
|
||
|
}
|
||
|
return source
|
||
|
}
|
||
|
|
||
|
func unMapSeed(soil []resMap, source int) (int) {
|
||
|
for _, m := range soil {
|
||
|
if source >= m.destStart && source < m.destStart + m.length {
|
||
|
return m.srcStart + (source - m.destStart)
|
||
|
}
|
||
|
}
|
||
|
return source
|
||
|
}
|
||
|
|
||
|
func seedLocOrigin(mappers [][]resMap, source int) int {
|
||
|
for i := range mappers {
|
||
|
fMaps := mappers[len(mappers)-i-1]
|
||
|
source = unMapSeed(fMaps, source)
|
||
|
}
|
||
|
return source
|
||
|
}
|
||
|
|
||
|
type resMap struct {
|
||
|
destStart int
|
||
|
srcStart int
|
||
|
length int
|
||
|
}
|
||
|
|