94 lines
1.6 KiB
Go
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
|
|
}
|