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 }