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 }