summaryrefslogtreecommitdiff
path: root/2023/go/internal/day_01/day_01.go
blob: 9cd0a49ca51233ecb8c6740ac38ef75fbc9c4b5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package day_01

import (
	"errors"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func Solve() {
	filename := "../_input/day_01.txt"
	content := readFile(filename)

	numbers := []int{}

	lines := strings.Split(content, "\n")
	for _, line := range lines {
		first_num, last_num, err := findNumbers(line)
		if err != nil {
			continue
		}

		num_str := first_num + last_num
		num := strToInt(num_str)
		numbers = append(numbers, num)
	}

	acc := accumulate(numbers)

	fmt.Println(acc)
}

func readFile(filename string) string {
	content, err := os.ReadFile(filename)
	if err != nil {
		panic(err)
	}

	return string(content)
}

var num_map = map[string]string{
	"zero":  "0",
	"0":     "0",
	"one":   "1",
	"1":     "1",
	"two":   "2",
	"2":     "2",
	"three": "3",
	"3":     "3",
	"four":  "4",
	"4":     "4",
	"five":  "5",
	"5":     "5",
	"six":   "6",
	"6":     "6",
	"seven": "7",
	"7":     "7",
	"eight": "8",
	"8":     "8",
	"nine":  "9",
	"9":     "9",
}

func findNumbers(line string) (string, string, error) {
	if line == "" || line == "\n" {
		return "", "", errors.New("Empty line")
	}

	found_numbers := []string{}
	window_size := 5
	for i := range line {
		window_end := i + window_size
		if window_end > len(line) {
			window_end = len(line)
		}
		sub_str := line[i:window_end]

		for key, value := range num_map {
			if strings.HasPrefix(sub_str, key) {
				found_numbers = append(found_numbers, value)
			}
		}
	}

	if len(found_numbers) == 0 {
		return "", "", errors.New("No numbers found")
	}

	first := found_numbers[0]
	last := found_numbers[len(found_numbers)-1]

	return first, last, nil
}

func accumulate(numbers []int) int {
	acc := 0

	for _, num := range numbers {
		acc += num
	}

	return acc
}

func strToInt(str string) int {
	num, err := strconv.ParseInt(str, 0, 0)
	if err != nil {
		panic(err)
	}

	return int(num)
}