88 lines
1.3 KiB
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
|
|
}
|