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)
}
|