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

75 lines
1.6 KiB
Go

package day13
import (
"math"
"strconv"
"strings"
"tools"
)
func getMoodMap(input []string, addYourself bool) ([]interface{}, map[string]map[string]int) {
moodMap := make(map[string]map[string]int)
var people []interface{}
for _, line := range input {
moodDescr := strings.Split(line, " ")
person1 := moodDescr[0]
person2 := moodDescr[10][:len(moodDescr[10])-1]
moodSwing, _ := strconv.Atoi(moodDescr[3])
if moodDescr[2] == "lose" {
moodSwing = -moodSwing
}
if _, ok := moodMap[person1]; !ok {
moodMap[person1] = make(map[string]int)
people = append(people, person1)
}
moodMap[person1][person2] = moodSwing
}
if addYourself {
people = append(people, "myself")
}
return people, moodMap
}
func getMinMaxMoods(permutations [][]interface{}, moodMap map[string]map[string]int) (int, int) {
minMood := math.MaxInt32
maxMood := 0
for _, v := range permutations {
thisMood := 0
for i := 0; i < len(v); i++ {
j := i + 1
if j == len(v) {
j = 0
}
thisMood += moodMap[v[i].(string)][v[j].(string)]
thisMood += moodMap[v[j].(string)][v[i].(string)]
}
if thisMood < minMood {
minMood = thisMood
}
if thisMood > maxMood {
maxMood = thisMood
}
}
return minMood, maxMood
}
func Part1(puzzle tools.AoCPuzzle) interface{} {
people, moodMap := getMoodMap(puzzle.GetInputArray(), false)
_, maxMood := getMinMaxMoods(tools.Permutations(people), moodMap)
return maxMood
}
func Part2(puzzle tools.AoCPuzzle) interface{} {
people, moodMap := getMoodMap(puzzle.GetInputArray(), true)
_, maxMood := getMinMaxMoods(tools.Permutations(people), moodMap)
return maxMood
}