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 }