master
1package main
2
3import (
4 "advent/internal/aoc"
5 "regexp"
6 "strconv"
7 "strings"
8)
9
10const (
11 dontRegex = `don't\(\).*?(do\(\)|$)`
12 mulRegex = `mul\([0-9]+,[0-9]+\)`
13 mulPrefix = "mul("
14 mulSuffix = ")"
15 mulSep = ","
16 findAll = -1
17)
18
19func mul(s string) int {
20 s = strings.TrimPrefix(s, mulPrefix)
21 s = strings.TrimSuffix(s, mulSuffix)
22 numbers := strings.Split(s, mulSep)
23 // TODO assert length, check errors
24 l, _ := strconv.Atoi(numbers[0])
25 r, _ := strconv.Atoi(numbers[1])
26 return l * r
27}
28
29func solvePart1(input []string) (solution int) {
30 r := regexp.MustCompile(mulRegex)
31
32 sum := 0
33 for _, line := range input {
34 matches := r.FindAllString(line, findAll)
35 for _, m := range matches {
36 v := mul(m)
37 sum += v
38 //fmt.Printf("%s=%d\n", m, v)
39 }
40 }
41 return sum
42}
43
44func solvePart2(input []string) (solution int) {
45 d := regexp.MustCompile(dontRegex)
46 r := regexp.MustCompile(mulRegex)
47
48 sum := 0
49 for _, line := range input {
50 line = d.ReplaceAllString(line, "")
51 matches := r.FindAllString(line, findAll)
52 for _, m := range matches {
53 v := mul(m)
54 sum += v
55 }
56 }
57 return sum
58}
59
60func main() {
61 day := aoc.Day3
62 aoc.SolveExample(day, aoc.Part1, solvePart1, 161)
63 aoc.SolvePuzzle(day, aoc.Part1, solvePart1, 189600467)
64 aoc.SolveExample(day, aoc.Part2, solvePart2, 48)
65 aoc.SolvePuzzle(day, aoc.Part2, solvePart2, 107069718)
66}