1
0
aoc-2024/day1.go
2024-12-04 22:45:05 +02:00

94 lines
1.6 KiB
Go

package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
type Day1Input struct {
column1 []int64
column2 []int64
}
func Day1Parse(lines []string) (*Day1Input, error) {
column1 := make([]int64, len(lines))
column2 := make([]int64, len(lines))
for i, line := range lines {
parts := strings.SplitN(line, " ", 2)
column1_value, err := strconv.ParseInt(strings.TrimSpace(parts[0]), 10, 0)
if err != nil {
return nil, err
}
column2_value, err := strconv.ParseInt(strings.TrimSpace(parts[1]), 10, 0)
if err != nil {
return nil, err
}
column1[i] = column1_value
column2[i] = column2_value
}
parsed := Day1Input{
column1,
column2,
}
return &parsed, nil
}
func Day1Part1(lines []string) (error) {
input, err := Day1Parse(lines)
if err != nil {
return err
}
sort.Slice(input.column1, func(i, j int) bool {
return input.column1[i] < input.column1[j]
})
sort.Slice(input.column2, func(i, j int) bool {
return input.column2[i] < input.column2[j]
})
var answer int64 = 0
for i := range len(input.column1) {
if input.column1[i] > input.column2[i] {
answer += input.column1[i] - input.column2[i];
} else {
answer += input.column2[i] - input.column1[i];
}
}
fmt.Println(answer)
return nil
}
func Day1Part2(lines []string) (error) {
input, err := Day1Parse(lines)
if err != nil {
return err
}
var answer int64 = 0
for _, value1 := range input.column1 {
var count int64 = 0
for _, value2 := range input.column2 {
if value1 == value2 {
count += 1
}
}
answer += count * value1
}
fmt.Println(answer)
return nil
}