summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/day3.rs30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/bin/day3.rs b/src/bin/day3.rs
index 02cb385..7acbd3d 100644
--- a/src/bin/day3.rs
+++ b/src/bin/day3.rs
@@ -4,19 +4,28 @@ static DAY: u8 = 3;
fn main() {
let input = advent::read_lines(DAY);
- println!("{DAY}a: {}", sum_multiplications(&input));
- println!("{DAY}b: {}", 0);
+ println!("{DAY}a: {}", sum_multiplications(&input, true));
+ println!("{DAY}b: {}", sum_multiplications(&input, false));
}
-fn sum_multiplications(input: &[String]) -> u32 {
- let re = Regex::new(r"mul\(([0-9]{1,3}),([0-9]{1,3})\)").unwrap();
+fn sum_multiplications(input: &[String], ignore_do: bool) -> u32 {
+ let re = Regex::new(r"(do)\(\)|(don't)\(\)|(mul)\(([0-9]{1,3}),([0-9]{1,3})\)").unwrap();
let mut sum = 0;
+ let mut muls_enabled = true;
for line in input {
for cap in re.captures_iter(line) {
- let f1 = cap[1].parse::<u32>().unwrap();
- let f2 = cap[2].parse::<u32>().unwrap();
- sum += f1 * f2;
+ if cap.get(1).is_some() { // do
+ muls_enabled = true;
+ } else if cap.get(2).is_some() { // don't
+ muls_enabled = false;
+ } else if cap.get(3).is_some() { // mul
+ if ignore_do || muls_enabled {
+ let f1 = cap[4].parse::<u32>().unwrap();
+ let f2 = cap[5].parse::<u32>().unwrap();
+ sum += f1 * f2;
+ }
+ }
}
}
sum
@@ -31,6 +40,11 @@ mod tests {
let input = [
"xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))"
].iter().map(|&x| String::from(x)).collect::<Vec<_>>();
- assert_eq!(sum_multiplications(&input), 161);
+ assert_eq!(sum_multiplications(&input, true), 161);
+
+ let input = [
+ "xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))"
+ ].iter().map(|&x| String::from(x)).collect::<Vec<_>>();
+ assert_eq!(sum_multiplications(&input, false), 48);
}
}