AoC Day 15, Parts 1 & 2 (Solved)
This commit is contained in:
112
2023/15/code.go
Normal file
112
2023/15/code.go
Normal file
@@ -0,0 +1,112 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/jpillora/puzzler/harness/aoc"
|
||||
)
|
||||
|
||||
func main() {
|
||||
aoc.Harness(run)
|
||||
}
|
||||
|
||||
// on code change, run will be executed 4 times:
|
||||
// 1. with: false (part1), and example input
|
||||
// 2. with: true (part2), and example input
|
||||
// 3. with: false (part1), and user input
|
||||
// 4. with: true (part2), and user input
|
||||
// the return value of each run is printed to stdout
|
||||
type Lense struct {
|
||||
Label string
|
||||
Focus int
|
||||
}
|
||||
|
||||
func run(part2 bool, input string) any {
|
||||
// when you're ready to do part 2, remove this "not implemented" block
|
||||
if part2 {
|
||||
boxes := make([][]Lense, 256)
|
||||
for _, l := range strings.Split(input, "\n") {
|
||||
if l == "" {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, s := range strings.Split(l, ",") {
|
||||
if strings.Contains(s, "-") {
|
||||
// Dash logic
|
||||
spl := strings.Split(s, "-")
|
||||
label := spl[0]
|
||||
box := hash(label)
|
||||
|
||||
remove:
|
||||
for i := range boxes[box] {
|
||||
if boxes[box][i].Label == label {
|
||||
boxes[box] = append(boxes[box][:i], boxes[box][i+1:]...)
|
||||
break remove
|
||||
}
|
||||
}
|
||||
|
||||
} else if strings.Contains(s, "=") {
|
||||
// Eq logic
|
||||
spl := strings.Split(s, "=")
|
||||
label := spl[0]
|
||||
lens, _ := strconv.Atoi(spl[1])
|
||||
|
||||
box := hash(label)
|
||||
|
||||
insert := Lense{label, lens}
|
||||
replaced := false
|
||||
|
||||
replace:
|
||||
for i := range boxes[box] {
|
||||
if boxes[box][i].Label == label {
|
||||
boxes[box][i] = insert
|
||||
replaced = true
|
||||
break replace
|
||||
}
|
||||
}
|
||||
|
||||
if !replaced {
|
||||
boxes[box] = append(boxes[box], insert)
|
||||
}
|
||||
|
||||
} else {
|
||||
panic(fmt.Sprintf("bad control '%v'", s))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate
|
||||
sum := 0
|
||||
for b := range boxes {
|
||||
for l := range boxes[b] {
|
||||
val := (1 + b) * (1 + l) * boxes[b][l].Focus
|
||||
sum += val
|
||||
}
|
||||
}
|
||||
|
||||
return sum
|
||||
}
|
||||
// solve part 1 here
|
||||
|
||||
hsum := 0
|
||||
for _, l := range strings.Split(input, "\n") {
|
||||
for _, s := range strings.Split(l, ",") {
|
||||
hsum += hash(s)
|
||||
}
|
||||
}
|
||||
|
||||
return hsum
|
||||
}
|
||||
|
||||
func hash(str string) int {
|
||||
h := 0
|
||||
for _, s := range str {
|
||||
ascii := int(rune(s))
|
||||
h += ascii
|
||||
h *= 17
|
||||
h = h % 256
|
||||
}
|
||||
return h
|
||||
}
|
||||
Reference in New Issue
Block a user