]> fbox.kageds.com Git - adventofcode.git/blob - 2023/go/day01/day01.go
20223 day1
[adventofcode.git] / 2023 / go / day01 / day01.go
1 package day01
2
3 import (
4 "adventofcode2023/utils"
5 "fmt"
6 "strings"
7 )
8 func Part1(input string) int {
9 num := 0
10 lines := strings.Split(input, "\n")
11 for _, line := range lines {
12 for i:=0;i<len(line);i++ {
13 if line[i] >= '0' && line[i] <= '9' {
14 num += utils.MustAtoi(string(line[i])) * 10
15 break;
16 }
17 }
18 for i:=len(line) - 1;i>=0;i-- {
19 if line[i] >= '0' && line[i] <= '9' {
20 num += utils.MustAtoi(string(line[i]))
21 break;
22 }
23 }
24 }
25 return num
26
27 }
28
29
30 func Part2(input string) int {
31 digits := make(map[string]string)
32 digits["one"] = "1"
33 digits["two"] = "2"
34 digits["three"] = "3"
35 digits["four"] = "4"
36 digits["five"] = "5"
37 digits["six"] = "6"
38 digits["seven"] = "7"
39 digits["eight"] = "8"
40 digits["nine"] = "9"
41
42 digits_backwards := make(map[string]string)
43 digits_backwards["eno"] = "1"
44 digits_backwards["owt"] = "2"
45 digits_backwards["eerht"] = "3"
46 digits_backwards["ruof"] = "4"
47 digits_backwards["evif"] = "5"
48 digits_backwards["xis"] = "6"
49 digits_backwards["neves"] = "7"
50 digits_backwards["thgie"] = "8"
51 digits_backwards["enin"] = "9"
52
53 num := 0
54 found := false
55 lines := strings.Split(input, "\n")
56 for _, line := range lines {
57 for i:=0;i<len(line);i++ {
58 if line[i] >= '0' && line[i] <= '9' {
59 fmt.Println("first digit:", string(line[i]))
60 num += utils.MustAtoi(string(line[i])) * 10
61 found = true
62 }
63 if found { break;}
64 for key := range digits {
65 if strings.HasPrefix(line[i:], key) {
66 fmt.Println("first digit:", digits[key])
67 num += utils.MustAtoi(digits[key]) * 10
68 found = true
69 }
70 if found { break;}
71 }
72 }
73
74 found = false
75
76 reverse := reverseString(line)
77
78 for i:=0;i<len(reverse);i++ {
79 if reverse[i] >= '0' && reverse[i] <= '9' {
80 fmt.Println("last digit:", string(reverse[i]))
81 num += utils.MustAtoi(string(reverse[i]))
82 found = true
83 }
84 if found { break;}
85 for key := range digits_backwards {
86 if strings.HasPrefix(reverse[i:], key) {
87 fmt.Println("last digit:", digits_backwards[key])
88 num += utils.MustAtoi(digits_backwards[key])
89 found = true
90 }
91 if found { break;}
92 }
93 }
94 found = false
95
96 }
97 return num
98 }
99
100 func reverseString(input string) string {
101 // Convert the string to a rune slice
102 runes := []rune(input)
103
104 // Get the length of the rune slice
105 length := len(runes)
106
107 // Reverse the order of runes
108 for i, j := 0, length-1; i < j; i, j = i+1, j-1 {
109 runes[i], runes[j] = runes[j], runes[i]
110 }
111
112 // Convert the reversed rune slice back to a string
113 reversedString := string(runes)
114
115 return reversedString
116 }