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