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