master
1package main
2
3import (
4 "advent/internal/aoc"
5 "log"
6 "sort"
7 "strconv"
8 "strings"
9)
10
11func parse(line string) (left, right int) {
12 sl := strings.Split(line, " ")
13 if len(sl) != 2 {
14 log.Fatal("failed to parse line")
15 }
16
17 l, err := strconv.Atoi(sl[0])
18 if err != nil {
19 log.Fatalf("failed to parse left=%q: %s\n", sl[0], err)
20 }
21
22 r, err := strconv.Atoi(sl[1])
23 if err != nil {
24 log.Fatalf("failed to parse left=%q: %s\n", sl[1], err)
25 }
26 return l, r
27}
28
29func solvePart1(input []string) (solution int) {
30 left, right := make([]int, len(input)), make([]int, len(input))
31 for i, line := range input {
32 left[i], right[i] = parse(line)
33 }
34
35 sort.Ints(left)
36 sort.Ints(right)
37
38 dist := 0
39 for i := range left {
40 diff := left[i] - right[i]
41 if diff < 0 {
42 diff = -diff
43 }
44 dist += diff
45 }
46 return dist
47}
48
49func solvePart2(input []string) (solution int) {
50
51 left := make([]int, len(input))
52 rightCount := make(map[int]int, len(input))
53
54 for i, line := range input {
55 l, r := parse(line)
56 left[i] = l
57 v, ok := rightCount[r]
58 if !ok {
59 rightCount[r] = 1
60 continue
61 }
62 rightCount[r] = v + 1
63 }
64
65 sim := 0
66 for _, l := range left {
67 rc, ok := rightCount[l]
68 if ok {
69 sim = sim + (l * rc)
70 }
71 }
72
73 return sim
74}
75
76func main() {
77 day := aoc.Day1
78 aoc.SolveExample(day, aoc.Part1, solvePart1, 11)
79 aoc.SolvePuzzle(day, aoc.Part1, solvePart1, 1388114)
80 aoc.SolveExample(day, aoc.Part2, solvePart2, 31)
81 aoc.SolvePuzzle(day, aoc.Part2, solvePart2, 23529853)
82}