aoc2015/day16/day.go
Stefan Harmuth e060351bbd day16
2020-12-28 11:57:27 +01:00

103 lines
2.1 KiB
Go

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 := make(tools.Set)
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
}