Skip to content

Commit d99aa4a

Browse files
committed
Refactor and keep regex implementation separately
This also adds a mode to our general function that lets us specify whether we want to include all multiplies, or only those for which the system is enabled.
1 parent d354a5a commit d99aa4a

File tree

1 file changed

+41
-11
lines changed

1 file changed

+41
-11
lines changed

aoc03/src/main.rs

+41-11
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,14 @@ fn get_input(filename: &str) -> Vec<String> {
1414
lines
1515
}
1616

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 {
1825
let mut sum = 0;
1926
let re = Regex::new(r"mul\(([0-9]{1,3}),([0-9]{1,3})\)").unwrap();
2027

@@ -25,7 +32,7 @@ fn sum_of_multiplies(lines: &Vec<String>) -> u32 {
2532
sum += l * r;
2633
}
2734
}
28-
println!("Sum: {}", sum);
35+
println!("Sum (regex): {}", sum);
2936
sum
3037
}
3138

@@ -89,6 +96,7 @@ fn parse_dont(chars: &Vec<char>, pos: usize) -> Option<usize> {
8996
}
9097
}
9198

99+
// Returns product and new cursor position if we parsed the regex r"mul\([0-9]{1,3},[0-9]{1,3}\)"
92100
fn parse_mul(chars: &Vec<char>, pos: usize) -> Option<(u32, usize)> {
93101
let len = chars.len();
94102

@@ -102,7 +110,7 @@ fn parse_mul(chars: &Vec<char>, pos: usize) -> Option<(u32, usize)> {
102110
return None;
103111
}
104112

105-
// Time to parse some integers (skipping "mul(")
113+
// Time to parse some integers skipping "mul("
106114
let (lhs, new_pos) = parse_up_to_3_digits(&chars, pos + 4)?;
107115

108116
// Still need to parse at least ",1)"
@@ -119,10 +127,10 @@ fn parse_mul(chars: &Vec<char>, pos: usize) -> Option<(u32, usize)> {
119127
}
120128

121129
let product = lhs * rhs;
122-
Some((product, new_pos + 1)) // Skipping rparen
130+
Some((product, new_pos + 1)) // Skipping rparen
123131
}
124132

125-
fn sum_of_enabled_multiplies(lines: &Vec<String>) -> u32 {
133+
fn sum_of_multiplies(lines: &Vec<String>, check: CheckEnabled) -> u32 {
126134
let mut sum = 0;
127135
let mut enabled = true;
128136
for line in lines {
@@ -137,7 +145,10 @@ fn sum_of_enabled_multiplies(lines: &Vec<String>) -> u32 {
137145
pos = new_pos;
138146
continue;
139147
} 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+
}
141152
pos = new_pos;
142153
continue;
143154
}
@@ -157,19 +168,36 @@ fn sum_of_enabled_multiplies(lines: &Vec<String>) -> u32 {
157168
pos += 1;
158169
}
159170
}
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);
161177
sum
162178
}
163179

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+
164188
#[test]
165189
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"));
167193
assert_eq!(sum, 161);
168194
}
169195

170196
#[test]
171197
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"));
173201
assert_eq!(sum, 188116424);
174202
}
175203

@@ -186,8 +214,10 @@ fn test_part2() {
186214
}
187215

188216
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"));
191221
sum_of_enabled_multiplies(&get_input("prelim2.txt"));
192222
sum_of_enabled_multiplies(&get_input("input.txt"));
193223
}

0 commit comments

Comments
 (0)