master
Raw Download raw file
 1package main
 2
 3import (
 4	"advent2023/internal/aoc"
 5	"log"
 6	"strconv"
 7	"strings"
 8)
 9
10func solvePart1(input []string) (solution int) {
11	sum := 0
12	for _, line := range input {
13		first := ""
14		last := ""
15		for _, c := range line {
16			if _, err := strconv.Atoi(string(c)); err == nil {
17				if first == "" {
18					first = string(c)
19				}
20				last = string(c)
21			}
22		}
23		value, err := strconv.Atoi(strings.Join([]string{first, last}, ""))
24		if err != nil {
25			log.Fatal(err)
26		}
27		sum = sum + value
28	}
29	return sum
30}
31
32var digits map[string]string = map[string]string{
33	"one":   "1",
34	"1":     "1",
35	"two":   "2",
36	"2":     "2",
37	"three": "3",
38	"3":     "3",
39	"four":  "4",
40	"4":     "4",
41	"five":  "5",
42	"5":     "5",
43	"six":   "6",
44	"6":     "6",
45	"seven": "7",
46	"7":     "7",
47	"eight": "8",
48	"8":     "8",
49	"nine":  "9",
50	"9":     "9",
51}
52
53type digitIndex struct {
54	digit string
55	index int
56}
57
58func solvePart2(input []string) (solution int) {
59	sum := 0
60	for _, line := range input {
61		first := digitIndex{digit: "", index: 5000}
62		last := digitIndex{digit: "", index: -1}
63		for k := range digits {
64			f := strings.Index(line, k)
65			if f != -1 && f < first.index {
66				first = digitIndex{digit: k, index: f}
67			}
68			l := strings.LastIndex(line, k)
69			if l != -1 && l > last.index {
70				last = digitIndex{digit: k, index: l}
71			}
72		}
73		joinedDigits := strings.Join([]string{digits[first.digit], digits[last.digit]}, "")
74		value, _ := strconv.Atoi(joinedDigits)
75		sum = sum + value
76	}
77	return sum
78}
79
80func main() {
81	day := aoc.Day1
82	// parameters: int day, int part, solve function, expected int
83	aoc.SolveExample(day, aoc.Part1, solvePart1, 142)
84	aoc.SolvePuzzle(day, aoc.Part1, solvePart1, 56397)
85	aoc.SolveExample(day, aoc.Part2, solvePart2, 281)
86	aoc.SolvePuzzle(day, aoc.Part2, solvePart2, 55701)
87}