diff --git a/day09/day.go b/day09/day.go index df4b106..7cf60f4 100644 --- a/day09/day.go +++ b/day09/day.go @@ -7,9 +7,9 @@ import ( "tools" ) -func getDistanceMap(input []string) ([]string, map[string]map[string]int) { +func getDistanceMap(input []string) ([]interface{}, map[string]map[string]int) { distances := make(map[string]map[string]int) - var retCities []string + var retCities []interface{} for _, line := range input { distDescr := strings.Split(line, " = ") @@ -31,42 +31,14 @@ func getDistanceMap(input []string) ([]string, map[string]map[string]int) { return retCities, distances } -func cityPermutations(slice []string) (permutations [][]string) { - if len(slice) == 1 { - return [][]string{slice} - } else if len(slice) == 2 { - return [][]string{ - { - slice[0], - slice[1], - }, - { - slice[1], - slice[0], - }, - } - } else { - for i := range slice { - newSlice := make([]string, i) - copy(newSlice, slice[:i]) - newSlice = append(newSlice, slice[i+1:]...) - subPermutations := cityPermutations(newSlice) - for _, subPermutation := range subPermutations { - permutations = append(permutations, append([]string{slice[i]}, subPermutation...)) - } - } - return permutations - } -} - -func getMinMaxDistances(permutations [][]string, distances map[string]map[string]int) (int, int) { +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]][v[i+1]] + thisDistance += distances[v[i].(string)][v[i+1].(string)] } if thisDistance < minDistance { minDistance = thisDistance @@ -81,14 +53,14 @@ func getMinMaxDistances(permutations [][]string, distances map[string]map[string func Part1(puzzle tools.AoCPuzzle) interface{} { cities, distances := getDistanceMap(puzzle.GetInputArray()) - minDistance, _ := getMinMaxDistances(cityPermutations(cities), distances) + minDistance, _ := getMinMaxDistances(tools.Permutations(cities), distances) return minDistance } func Part2(puzzle tools.AoCPuzzle) interface{} { cities, distances := getDistanceMap(puzzle.GetInputArray()) - _, maxDistance := getMinMaxDistances(cityPermutations(cities), distances) + _, maxDistance := getMinMaxDistances(tools.Permutations(cities), distances) return maxDistance } diff --git a/day13/day.go b/day13/day.go index 4bbe60f..220e44d 100644 --- a/day13/day.go +++ b/day13/day.go @@ -7,9 +7,9 @@ import ( "tools" ) -func getMoodMap(input []string, addYourself bool) ([]string, map[string]map[string]int) { +func getMoodMap(input []string, addYourself bool) ([]interface{}, map[string]map[string]int) { moodMap := make(map[string]map[string]int) - var people []string + var people []interface{} for _, line := range input { moodDescr := strings.Split(line, " ") @@ -34,35 +34,7 @@ func getMoodMap(input []string, addYourself bool) ([]string, map[string]map[stri return people, moodMap } -func seatingPermutations(slice []string) (permutations [][]string) { - if len(slice) == 1 { - return [][]string{slice} - } else if len(slice) == 2 { - return [][]string{ - { - slice[0], - slice[1], - }, - { - slice[1], - slice[0], - }, - } - } else { - for i := range slice { - newSlice := make([]string, i) - copy(newSlice, slice[:i]) - newSlice = append(newSlice, slice[i+1:]...) - subPermutations := seatingPermutations(newSlice) - for _, subPermutation := range subPermutations { - permutations = append(permutations, append([]string{slice[i]}, subPermutation...)) - } - } - return permutations - } -} - -func getMinMaxMoods(permutations [][]string, moodMap map[string]map[string]int) (int, int) { +func getMinMaxMoods(permutations [][]interface{}, moodMap map[string]map[string]int) (int, int) { minMood := math.MaxInt32 maxMood := 0 @@ -73,8 +45,8 @@ func getMinMaxMoods(permutations [][]string, moodMap map[string]map[string]int) if j == len(v) { j = 0 } - thisMood += moodMap[v[i]][v[j]] - thisMood += moodMap[v[j]][v[i]] + thisMood += moodMap[v[i].(string)][v[j].(string)] + thisMood += moodMap[v[j].(string)][v[i].(string)] } if thisMood < minMood { minMood = thisMood @@ -89,14 +61,14 @@ func getMinMaxMoods(permutations [][]string, moodMap map[string]map[string]int) func Part1(puzzle tools.AoCPuzzle) interface{} { people, moodMap := getMoodMap(puzzle.GetInputArray(), false) - _, maxMood := getMinMaxMoods(seatingPermutations(people), moodMap) + _, maxMood := getMinMaxMoods(tools.Permutations(people), moodMap) return maxMood } func Part2(puzzle tools.AoCPuzzle) interface{} { people, moodMap := getMoodMap(puzzle.GetInputArray(), true) - _, maxMood := getMinMaxMoods(seatingPermutations(people), moodMap) + _, maxMood := getMinMaxMoods(tools.Permutations(people), moodMap) return maxMood }