@@ -14,7 +14,14 @@ fn get_input(filename: &str) -> Vec<String> {
14
14
lines
15
15
}
16
16
17
- fn sum_of_multiplies ( lines : & Vec < String > ) -> u32 {
17
+ #[ derive( PartialEq ) ]
18
+ enum CheckEnabled {
19
+ Checked ,
20
+ Unchecked ,
21
+ }
22
+
23
+ // This was my first solution to part 1, which works nicely, but I needed a better parser for part 2
24
+ fn sum_of_multiplies_regex ( lines : & Vec < String > ) -> u32 {
18
25
let mut sum = 0 ;
19
26
let re = Regex :: new ( r"mul\(([0-9]{1,3}),([0-9]{1,3})\)" ) . unwrap ( ) ;
20
27
@@ -25,7 +32,7 @@ fn sum_of_multiplies(lines: &Vec<String>) -> u32 {
25
32
sum += l * r;
26
33
}
27
34
}
28
- println ! ( "Sum: {}" , sum) ;
35
+ println ! ( "Sum (regex) : {}" , sum) ;
29
36
sum
30
37
}
31
38
@@ -89,6 +96,7 @@ fn parse_dont(chars: &Vec<char>, pos: usize) -> Option<usize> {
89
96
}
90
97
}
91
98
99
+ // Returns product and new cursor position if we parsed the regex r"mul\([0-9]{1,3},[0-9]{1,3}\)"
92
100
fn parse_mul ( chars : & Vec < char > , pos : usize ) -> Option < ( u32 , usize ) > {
93
101
let len = chars. len ( ) ;
94
102
@@ -102,7 +110,7 @@ fn parse_mul(chars: &Vec<char>, pos: usize) -> Option<(u32, usize)> {
102
110
return None ;
103
111
}
104
112
105
- // Time to parse some integers ( skipping "mul(")
113
+ // Time to parse some integers skipping "mul("
106
114
let ( lhs, new_pos) = parse_up_to_3_digits ( & chars, pos + 4 ) ?;
107
115
108
116
// Still need to parse at least ",1)"
@@ -119,10 +127,10 @@ fn parse_mul(chars: &Vec<char>, pos: usize) -> Option<(u32, usize)> {
119
127
}
120
128
121
129
let product = lhs * rhs;
122
- Some ( ( product, new_pos + 1 ) ) // Skipping rparen
130
+ Some ( ( product, new_pos + 1 ) ) // Skipping rparen
123
131
}
124
132
125
- fn sum_of_enabled_multiplies ( lines : & Vec < String > ) -> u32 {
133
+ fn sum_of_multiplies ( lines : & Vec < String > , check : CheckEnabled ) -> u32 {
126
134
let mut sum = 0 ;
127
135
let mut enabled = true ;
128
136
for line in lines {
@@ -137,7 +145,10 @@ fn sum_of_enabled_multiplies(lines: &Vec<String>) -> u32 {
137
145
pos = new_pos;
138
146
continue ;
139
147
} else if let Some ( new_pos) = parse_dont ( & chars, pos) {
140
- enabled = false ;
148
+ // Only disable if we've enabled checked multiplies
149
+ if check == CheckEnabled :: Checked {
150
+ enabled = false ;
151
+ }
141
152
pos = new_pos;
142
153
continue ;
143
154
}
@@ -157,19 +168,36 @@ fn sum_of_enabled_multiplies(lines: &Vec<String>) -> u32 {
157
168
pos += 1 ;
158
169
}
159
170
}
160
- println ! ( "Sum (do/don't): {}" , sum) ;
171
+ let check_msg = if check == CheckEnabled :: Unchecked {
172
+ "unchecked"
173
+ } else {
174
+ "checked"
175
+ } ;
176
+ println ! ( "Sum ({}): {}" , check_msg, sum) ;
161
177
sum
162
178
}
163
179
180
+ fn sum_of_all_multiplies ( lines : & Vec < String > ) -> u32 {
181
+ sum_of_multiplies ( lines, CheckEnabled :: Unchecked )
182
+ }
183
+
184
+ fn sum_of_enabled_multiplies ( lines : & Vec < String > ) -> u32 {
185
+ sum_of_multiplies ( lines, CheckEnabled :: Checked )
186
+ }
187
+
164
188
#[ test]
165
189
fn test_prelim ( ) {
166
- let sum = sum_of_multiplies ( & get_input ( "prelim.txt" ) ) ;
190
+ let sum = sum_of_all_multiplies ( & get_input ( "prelim.txt" ) ) ;
191
+ assert_eq ! ( sum, 161 ) ;
192
+ let sum = sum_of_multiplies_regex ( & get_input ( "prelim.txt" ) ) ;
167
193
assert_eq ! ( sum, 161 ) ;
168
194
}
169
195
170
196
#[ test]
171
197
fn test_part1 ( ) {
172
- let sum = sum_of_multiplies ( & get_input ( "input.txt" ) ) ;
198
+ let sum = sum_of_all_multiplies ( & get_input ( "input.txt" ) ) ;
199
+ assert_eq ! ( sum, 188116424 ) ;
200
+ let sum = sum_of_multiplies_regex ( & get_input ( "input.txt" ) ) ;
173
201
assert_eq ! ( sum, 188116424 ) ;
174
202
}
175
203
@@ -186,8 +214,10 @@ fn test_part2() {
186
214
}
187
215
188
216
fn main ( ) {
189
- sum_of_multiplies ( & get_input ( "prelim.txt" ) ) ;
190
- sum_of_multiplies ( & get_input ( "input.txt" ) ) ;
217
+ sum_of_multiplies_regex ( & get_input ( "prelim.txt" ) ) ;
218
+ sum_of_multiplies_regex ( & get_input ( "input.txt" ) ) ;
219
+ sum_of_all_multiplies ( & get_input ( "prelim.txt" ) ) ;
220
+ sum_of_all_multiplies ( & get_input ( "input.txt" ) ) ;
191
221
sum_of_enabled_multiplies ( & get_input ( "prelim2.txt" ) ) ;
192
222
sum_of_enabled_multiplies ( & get_input ( "input.txt" ) ) ;
193
223
}
0 commit comments