move permutations function to tools module

This commit is contained in:
Stefan Harmuth 2020-12-27 09:16:25 +01:00
parent 5952e6bc61
commit 13428cc28a
2 changed files with 13 additions and 69 deletions

View File

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

View File

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