summaryrefslogtreecommitdiff
path: root/2023/go/internal/day_01
diff options
context:
space:
mode:
authorDJ O'Leary <dijitol@proton.me>2025-11-29 20:23:02 +0100
committerDJ O'Leary <dijitol@proton.me>2025-11-29 20:23:02 +0100
commit4c3a50166bf0f78ce89459c352cc1c6536a8b96d (patch)
tree02e4b66a1435680ef1e92bf82576747b27f16447 /2023/go/internal/day_01
parentbe2f8528b3829f8263507da301812d852297c168 (diff)
chore: make language folders snake_case
Diffstat (limited to '2023/go/internal/day_01')
-rw-r--r--2023/go/internal/day_01/day_01.go114
-rw-r--r--2023/go/internal/day_01/day_01_test.go31
2 files changed, 145 insertions, 0 deletions
diff --git a/2023/go/internal/day_01/day_01.go b/2023/go/internal/day_01/day_01.go
new file mode 100644
index 0000000..9cd0a49
--- /dev/null
+++ b/2023/go/internal/day_01/day_01.go
@@ -0,0 +1,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)
+}
diff --git a/2023/go/internal/day_01/day_01_test.go b/2023/go/internal/day_01/day_01_test.go
new file mode 100644
index 0000000..8063619
--- /dev/null
+++ b/2023/go/internal/day_01/day_01_test.go
@@ -0,0 +1,31 @@
+package day_01
+
+import (
+ "testing"
+)
+
+type input string
+type answer string
+
+func TestFindNumbers(t *testing.T) {
+ data := map[input]answer{
+ "1abc2": "12",
+ "pqr3stu8vwx": "38",
+ "a1b2c3d4e5f": "15",
+ "treb7uchet": "77",
+ }
+
+ for input, expected := range data {
+ actual_first, actual_last, err := findNumbers(string(input))
+
+ if err != nil {
+ t.Error("find_numbers returned an error")
+ }
+
+ actual := actual_first + actual_last
+
+ if actual != string(expected) {
+ t.Errorf("Expected %s, got %s", expected, actual)
+ }
+ }
+}