@@ -45,39 +45,50 @@ func main() {
45
45
}
46
46
defer input .Close ()
47
47
48
- result := 0
48
+ var firstPartResult , secondPartResult int
49
49
50
50
// NB (alkurbatov): Becase the input contains strings like oneight, eighthree or sevenine
51
- // and Golang does not provide negative lookahead, we have to try reversed approach.
52
- firstDigit := regexp .MustCompile (`\d|one|two|three|four|five|six|seven|eight|nine` )
53
- lastDigit := regexp .MustCompile (`\d|eno|owt|eerht|ruof|evif|xis|neves|thgie|enin` )
51
+ // and Golang does not provide negative lookahead, we have to try 'reversed' approach.
52
+ digits := regexp .MustCompile (`\d` )
53
+ firstNumber := regexp .MustCompile (`\d|one|two|three|four|five|six|seven|eight|nine` )
54
+ lastNumber := regexp .MustCompile (`\d|eno|owt|eerht|ruof|evif|xis|neves|thgie|enin` )
54
55
55
56
scanner := bufio .NewScanner (input )
56
57
for scanner .Scan () {
57
58
src := scanner .Text ()
58
59
59
- first := firstDigit . FindString (src )
60
- if first == "" {
61
- log .Printf ("Failed to find first digit in input string: %s" , src )
60
+ allDigits := digits . FindAllString (src , - 1 )
61
+ if len ( allDigits ) == 0 {
62
+ log .Printf ("Failed to find all digits in input string: %s" , src )
62
63
return
63
64
}
64
65
65
- last := lastDigit .FindString (reverse (src ))
66
- if last == "" {
67
- log .Printf ("Failed to find last digit in input string: %s" , src )
66
+ hiddenNumber := numsMap [allDigits [0 ]]* 10 + numsMap [allDigits [len (allDigits )- 1 ]]
67
+ firstPartResult += hiddenNumber
68
+ log .Printf ("Part 1: %s -> %d" , src , hiddenNumber )
69
+
70
+ firstNum := firstNumber .FindString (src )
71
+ if firstNum == "" {
72
+ log .Printf ("Failed to find first number in input string: %s" , src )
68
73
return
69
74
}
70
75
71
- hiddenNumber := numsMap [first ]* 10 + numsMap [reverse (last )]
72
- result += hiddenNumber
76
+ lastNum := lastNumber .FindString (reverse (src ))
77
+ if lastNum == "" {
78
+ log .Printf ("Failed to find last number in input string: %s" , src )
79
+ return
80
+ }
73
81
74
- log .Printf ("%s -> %d" , src , hiddenNumber )
82
+ hiddenNumber = numsMap [firstNum ]* 10 + numsMap [reverse (lastNum )]
83
+ secondPartResult += hiddenNumber
84
+ log .Printf ("Part 2: %s -> %d" , src , hiddenNumber )
75
85
}
76
86
77
87
if err := scanner .Err (); err != nil {
78
88
log .Printf ("Failed to scan input.txt: %v" , err )
79
89
return
80
90
}
81
91
82
- log .Printf ("Result: %d" , result )
92
+ log .Printf ("Part 1 result: %d" , firstPartResult )
93
+ log .Printf ("Part 2 result: %d" , secondPartResult )
83
94
}
0 commit comments