@@ -2,13 +2,20 @@ use regex::Regex;
22
33use 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) ]
1320pub 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) ]
2229pub 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) ]
3149mod 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