2022-12-10 09:37:21 +00:00
|
|
|
package day03
|
2022-12-05 08:03:39 +00:00
|
|
|
|
|
|
|
|
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
|
|
|
|
|
}
|