package day03 type Solver struct { rucksacks []Rucksack groups []ElfSet } type Rucksack struct { compartment1, compartment2 []byte } type ElfSet struct { elfItems [3]map[byte]bool } func (s *Solver) ParseInput(input []string) { s.rucksacks = make([]Rucksack, len(input)) for i, line := range input { s.rucksacks[i] = Rucksack{ compartment1: []byte(line[:len(line)/2]), compartment2: []byte(line[len(line)/2:]), } } // fmt.Printf("%v\n", s.rucksacks) var elfSet ElfSet for i, line := range input { elfIndex := i % len(elfSet.elfItems) if elfIndex == 0 { elfSet = ElfSet{} } if elfSet.elfItems[elfIndex] == nil { elfSet.elfItems[elfIndex] = make(map[byte]bool, 0) } for _, b := range []byte(line) { elfSet.elfItems[elfIndex][b] = true } if i%3 == 2 { s.groups = append(s.groups, elfSet) } } // fmt.Printf("%+v\n", s.groups) } func (s *Solver) SolvePart1() any { var total int for _, r := range s.rucksacks { m := make(map[byte]bool, 0) for _, b := range r.compartment1 { m[b] = true } for _, b := range r.compartment2 { if _, ok := m[b]; ok { total += getValue(b) break } } } return total } func getValue(b byte) int { if b >= 'a' && b <= 'z' { return int(b - 'a' + 1) } else { return int(b - 'A' + 27) } } func (s *Solver) SolvePart2() any { var total int for _, g := range s.groups { for item := range g.elfItems[0] { if _, ok := g.elfItems[1][item]; !ok { continue } if _, ok := g.elfItems[2][item]; !ok { continue } total += getValue(item) // fmt.Println(string(item)) break } } return total }