aoc2015/day09/day.go
2020-12-27 09:16:25 +01:00

67 lines
1.7 KiB
Go

package day09
import (
"math"
"strconv"
"strings"
"tools"
)
func getDistanceMap(input []string) ([]interface{}, map[string]map[string]int) {
distances := make(map[string]map[string]int)
var retCities []interface{}
for _, line := range input {
distDescr := strings.Split(line, " = ")
cities := strings.Split(distDescr[0], " to ")
distance, _ := strconv.Atoi(distDescr[1])
if _, ok := distances[cities[0]]; !ok {
distances[cities[0]] = make(map[string]int)
retCities = append(retCities, cities[0])
}
distances[cities[0]][cities[1]] = distance
if _, ok := distances[cities[1]]; !ok {
distances[cities[1]] = make(map[string]int)
retCities = append(retCities, cities[1])
}
distances[cities[1]][cities[0]] = distance
}
return retCities, distances
}
func getMinMaxDistances(permutations [][]interface{}, distances map[string]map[string]int) (int, int) {
minDistance := math.MaxInt32
maxDistance := 0
for _, v := range permutations {
thisDistance := 0
for i := 0; i < len(v)-1; i++ {
thisDistance += distances[v[i].(string)][v[i+1].(string)]
}
if thisDistance < minDistance {
minDistance = thisDistance
}
if thisDistance > maxDistance {
maxDistance = thisDistance
}
}
return minDistance, maxDistance
}
func Part1(puzzle tools.AoCPuzzle) interface{} {
cities, distances := getDistanceMap(puzzle.GetInputArray())
minDistance, _ := getMinMaxDistances(tools.Permutations(cities), distances)
return minDistance
}
func Part2(puzzle tools.AoCPuzzle) interface{} {
cities, distances := getDistanceMap(puzzle.GetInputArray())
_, maxDistance := getMinMaxDistances(tools.Permutations(cities), distances)
return maxDistance
}