aoc-2022/day3/day3.go

91 lines
1.6 KiB
Go
Raw Normal View History

2022-12-05 08:03:39 +00:00
package day3
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
}