103 lines
2.1 KiB
Go
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 := 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
|
|
}
|