This commit is contained in:
Moritz Hölting 2023-12-15 12:07:07 +01:00
parent d93dc91117
commit 4fdfb188f5
7 changed files with 131 additions and 1 deletions

View File

@ -4,7 +4,8 @@ members = [
"day-*"
]
exclude = [
"day-04"
"day-04",
"day-15"
]
[workspace.dependencies]

23
day-15/day15_test.go Normal file
View File

@ -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)
}
}

3
day-15/go.mod Normal file
View File

@ -0,0 +1,3 @@
module adventofcode/2023/day-15
go 1.21.5

1
day-15/input.txt Normal file

File diff suppressed because one or more lines are too long

19
day-15/main.go Normal file
View File

@ -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)
}

20
day-15/part1.go Normal file
View File

@ -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
}

63
day-15/part2.go Normal file
View File

@ -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
}