Skip to content

Commit 838d3ed

Browse files
committed
Add day3 part2
1 parent 569050c commit 838d3ed

File tree

1 file changed

+32
-11
lines changed

1 file changed

+32
-11
lines changed

src/day3.rs

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,20 @@ use regex::Regex;
22

33
use aoc_runner_derive::{aoc, aoc_generator};
44

5-
#[aoc_generator(day3)]
6-
pub fn input_generator(input: &str) -> Vec<String> {
5+
#[aoc_generator(day3, part1)]
6+
pub fn input_generator_part1(input: &str) -> Vec<String> {
77
let re = Regex::new(r"(mul\(\d+,\d+\))").unwrap();
88
let matches: Vec<_> = re.find_iter(input).map(|m| m.as_str()).collect();
99
matches.iter().map(|&s| s.to_string()).collect()
1010
}
1111

12+
#[aoc_generator(day3, part2)]
13+
pub fn input_generator_part2(input: &str) -> Vec<String> {
14+
let re = Regex::new(r"(mul\(\d+,\d+\)|do\(\)|don't\(\))").unwrap();
15+
let matches: Vec<_> = re.find_iter(input).map(|m| m.as_str()).collect();
16+
matches.iter().map(|&s| s.to_string()).collect()
17+
}
18+
1219
#[aoc(day3, part1)]
1320
pub fn part1(input: &[String]) -> usize {
1421
let re = Regex::new(r"(?<a>\d+),(?<b>\d+)").unwrap();
@@ -20,26 +27,40 @@ pub fn part1(input: &[String]) -> usize {
2027

2128
#[aoc(day3, part2)]
2229
pub fn part2(input: &[String]) -> usize {
30+
let mut activate = true;
2331
let re = Regex::new(r"(?<a>\d+),(?<b>\d+)").unwrap();
24-
input.iter().fold(0, |acc, m| {
25-
let caps = re.captures(m).unwrap();
26-
acc + (caps["a"].parse::<usize>().unwrap() * caps["b"].parse::<usize>().unwrap())
32+
input.iter().fold(0, |mut acc, m| {
33+
match m.as_str() {
34+
"do()" => activate = true,
35+
"don't()" => activate = false,
36+
_ => {
37+
if activate {
38+
let caps = re.captures(m).unwrap();
39+
acc +=
40+
caps["a"].parse::<usize>().unwrap() * caps["b"].parse::<usize>().unwrap();
41+
}
42+
}
43+
}
44+
acc
2745
})
2846
}
2947

3048
#[cfg(test)]
3149
mod tests {
3250
use super::*;
3351

34-
const INPUT: &str = "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))";
52+
const INPUT_1: &str = "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))";
3553

3654
#[test]
3755
fn test_part1() {
38-
assert_eq!(161, part1(&input_generator(INPUT)))
56+
assert_eq!(161, part1(&input_generator_part1(INPUT_1)))
3957
}
4058

41-
// #[test]
42-
// fn test_part2() {
43-
// assert_eq!(4, part2(&input_generator(INPUT)))
44-
// }
59+
const INPUT_2: &str =
60+
"xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))";
61+
62+
#[test]
63+
fn test_part2() {
64+
assert_eq!(48, part2(&input_generator_part2(INPUT_2)))
65+
}
4566
}

0 commit comments

Comments
 (0)