master
Raw Download raw file
 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}