diff options
| author | Reiner Herrmann <reiner@reiner-h.de> | 2024-12-03 18:16:38 +0100 |
|---|---|---|
| committer | Reiner Herrmann <reiner@reiner-h.de> | 2024-12-03 18:16:38 +0100 |
| commit | cdb7849b30ae85c94e77a5a02b16dcc9378d84dd (patch) | |
| tree | 6ab8a6ae374370f58a7a1bc7f5c075390f536fd6 /src/bin | |
| parent | 00aebf045590210f4e83a508eec573b2f0558c9d (diff) | |
day3 solution 2
Diffstat (limited to 'src/bin')
| -rw-r--r-- | src/bin/day3.rs | 30 |
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); } } |
