day 15
This commit is contained in:
parent
d93dc91117
commit
4fdfb188f5
|
@ -4,7 +4,8 @@ members = [
|
||||||
"day-*"
|
"day-*"
|
||||||
]
|
]
|
||||||
exclude = [
|
exclude = [
|
||||||
"day-04"
|
"day-04",
|
||||||
|
"day-15"
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
var input string = "rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7"
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
expected := 1320
|
||||||
|
actual := part1(input)
|
||||||
|
|
||||||
|
if actual != expected {
|
||||||
|
t.Errorf("part1 = %d, expected %d", actual, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
expected := 145
|
||||||
|
actual := part2(input)
|
||||||
|
|
||||||
|
if actual != expected {
|
||||||
|
t.Errorf("part2 = %d, expected %d", actual, expected)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
module adventofcode/2023/day-15
|
||||||
|
|
||||||
|
go 1.21.5
|
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,19 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data, err := os.ReadFile("./input.txt")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
input := string(data)
|
||||||
|
|
||||||
|
p1 := part1(input)
|
||||||
|
fmt.Printf("part1: %d\n", p1)
|
||||||
|
p2 := part2(input)
|
||||||
|
fmt.Printf("part2: %d\n", p2)
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func part1(input string) int {
|
||||||
|
parts := strings.Split(input, ",")
|
||||||
|
sum := 0
|
||||||
|
for _, p := range parts {
|
||||||
|
lsum := 0
|
||||||
|
for _, c := range p {
|
||||||
|
lsum += int(c)
|
||||||
|
lsum *= 17
|
||||||
|
lsum %= 256
|
||||||
|
}
|
||||||
|
sum += lsum
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"slices"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type lens struct {
|
||||||
|
focal_length int
|
||||||
|
label string
|
||||||
|
}
|
||||||
|
|
||||||
|
func part2(input string) int {
|
||||||
|
instructions := strings.Split(input, ",")
|
||||||
|
boxes := make([][]lens, 256)
|
||||||
|
for _, instruction := range instructions {
|
||||||
|
if strings.Contains(instruction, "=") {
|
||||||
|
split := strings.Split(instruction, "=")
|
||||||
|
label := split[0]
|
||||||
|
box_index := hash(label)
|
||||||
|
focal_length, _ := strconv.Atoi(split[1])
|
||||||
|
found_box := boxes[box_index]
|
||||||
|
lens_index := slices.IndexFunc(found_box, func(l lens) bool {
|
||||||
|
return l.label == label
|
||||||
|
})
|
||||||
|
if lens_index >= 0 {
|
||||||
|
found_box[lens_index] = lens{focal_length, label}
|
||||||
|
boxes[box_index] = found_box
|
||||||
|
} else {
|
||||||
|
boxes[box_index] = append(found_box, lens{focal_length, label})
|
||||||
|
}
|
||||||
|
} else if strings.Contains(instruction, "-") {
|
||||||
|
split := strings.Split(instruction, "-")
|
||||||
|
label := split[0]
|
||||||
|
box_index := hash(label)
|
||||||
|
found_box := boxes[box_index]
|
||||||
|
boxes[box_index] = slices.DeleteFunc(found_box, func(l lens) bool {
|
||||||
|
return l.label == label
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sum := 0
|
||||||
|
|
||||||
|
for box_number, box := range boxes {
|
||||||
|
for slot_number, lens := range box {
|
||||||
|
sum += ((box_number + 1) * (slot_number + 1) * lens.focal_length)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
func hash(input string) int {
|
||||||
|
sum := 0
|
||||||
|
for _, c := range input {
|
||||||
|
sum += int(c)
|
||||||
|
sum *= 17
|
||||||
|
sum %= 256
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
Loading…
Reference in New Issue