aoc-2022/day04/solution.go

88 lines
1.3 KiB
Go

package day04
import (
"strconv"
"strings"
)
type Solver struct {
elfPairs []ElfPair
}
type ElfPair struct {
first, second map[int]bool
}
func (s *Solver) ParseInput(input []string) {
s.elfPairs = make([]ElfPair, len(input))
for pairIndex, line := range input {
pairs := strings.Split(line, ",")
var i, j int
p1 := strings.Split(pairs[0], "-")
m1 := make(map[int]bool)
i, _ = strconv.Atoi(p1[0])
j, _ = strconv.Atoi(p1[1])
for ; i <= j; i++ {
m1[i] = true
}
p2 := strings.Split(pairs[1], "-")
m2 := make(map[int]bool)
i, _ = strconv.Atoi(p2[0])
j, _ = strconv.Atoi(p2[1])
for ; i <= j; i++ {
m2[i] = true
}
s.elfPairs[pairIndex] = ElfPair{m1, m2}
}
}
func (s *Solver) SolvePart1() any {
var total int
for _, ep := range s.elfPairs {
if contains(ep.first, ep.second) || contains(ep.second, ep.first) {
total += 1
}
}
return total
}
func (s *Solver) SolvePart2() any {
var total int
for _, ep := range s.elfPairs {
if len(intersect(ep.first, ep.second)) > 0 {
total += 1
}
}
return total
}
func contains(m1, m2 map[int]bool) bool {
for k := range m1 {
if _, ok := m2[k]; !ok {
return false
}
}
return true
}
func intersect(m1, m2 map[int]bool) []int {
result := make([]int, 0)
for k := range m1 {
if _, ok := m2[k]; ok {
result = append(result, k)
}
}
return result
}