Files
adventofcode/2023/go/day15/day15.go
2024-12-01 08:01:55 +00:00

80 lines
1.4 KiB
Go

package day15
import (
"adventofcode2023/utils"
_ "fmt"
"strings"
)
type Lens struct {
label string
fl int
}
func Part1(input string) int {
ans := 0
seqs := strings.Split(input, ",")
for _,seq := range seqs {
ans += hash(seq)
}
return ans
}
func Part2(input string) int {
Boxes := [256][]Lens{}
cmds := strings.Split(input, ",")
for _,cmd := range cmds {
if cmd[len(cmd)-1] == '-' {
label := cmd[:len(cmd)-1]
hash := hash(label)
nl := []Lens{}
for _, lens := range Boxes[hash] {
if lens.label != label {
nl = append(nl, lens)
}
}
Boxes[hash] = nl
} else {
tokens := strings.Split(cmd, "=")
label := tokens[0]
fl := utils.MustAtoi(tokens[1])
hash := hash(label)
nl := []Lens{}
if len(Boxes[hash]) == 0 {
Boxes[hash] = append(Boxes[hash], Lens{label:label, fl:fl})
} else {
found := false
for _, lens := range Boxes[hash] {
if lens.label == label {
nl = append(nl, Lens{label:label, fl:fl})
found = true
} else {
nl = append(nl, lens)
}
}
Boxes[hash] = nl
if ! found {
Boxes[hash] = append(Boxes[hash], Lens{label:label, fl:fl})
}
}
}
}
ans := 0
for i, box := range Boxes {
for j, lens := range box {
ans += (i+1) * (j +1) * lens.fl
}
}
return ans
}
func hash(in string) int {
result := 0
for _, letter := range in {
result += int(letter)
result = result * 17
result = result % 256
}
return result
}