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 }