package day16 import ( "strconv" "strings" "tools" ) var knownSpecs = map[string]int{ "children": 3, "cats": 7, "samoyeds": 2, "pomeranians": 3, "akitas": 0, "vizslas": 0, "goldfish": 5, "trees": 3, "cars": 2, "perfumes": 1, } func getSueSpecSlice(input []string) []map[string]int { var sueSpecs []map[string]int var specName string var specValue int for _, line := range input { lineParts := strings.Split(line, ", ") thisSpecs := make(map[string]int) for _, linePart := range lineParts { spec := strings.Split(linePart, ": ") if len(spec) == 3 { // Sue xxx: bla: 1 specName = spec[1] specValue, _ = strconv.Atoi(spec[2]) } else { specName = spec[0] specValue, _ = strconv.Atoi(spec[1]) } thisSpecs[specName] = specValue } sueSpecs = append(sueSpecs, thisSpecs) } return sueSpecs } func Part1(puzzle tools.AoCPuzzle) interface{} { sueSpecs := getSueSpecSlice(puzzle.GetInputArray()) var answer int for sueNumber, specs := range sueSpecs { match := true for k, v := range specs { if knownSpecs[k] != v { match = false break } } if match { // remember: sueSpecs' index starts with 0 - the Sue-Count starts with 1 answer = sueNumber + 1 break } } return answer } func Part2(puzzle tools.AoCPuzzle) interface{} { sueSpecs := getSueSpecSlice(puzzle.GetInputArray()) dontCheckExact := tools.NewSet() dontCheckExact.Add("cats") dontCheckExact.Add("trees") dontCheckExact.Add("pomeranians") dontCheckExact.Add("goldfish") var answer int for sueNumber, specs := range sueSpecs { match := true for k, v := range specs { if (k == "cats" || k == "trees") && v <= knownSpecs[k] { match = false break } if (k == "pomeranians" || k == "goldfish") && v >= knownSpecs[k] { match = false break } if !dontCheckExact.Contains(k) && v != knownSpecs[k] { match = false break } } if match { // remember: sueSpecs' index starts with 0 - the Sue-Count starts with 1 answer = sueNumber + 1 break } } return answer }