From 37da94a2468156566825f3fa60ba5be6003ffdda Mon Sep 17 00:00:00 2001 From: Anson Biggs Date: Sun, 3 Dec 2023 15:01:40 -0700 Subject: [PATCH] part 2 --- src/day3.rs | 68 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/src/day3.rs b/src/day3.rs index 35bdfc5..e867316 100644 --- a/src/day3.rs +++ b/src/day3.rs @@ -8,7 +8,7 @@ pub fn run() { let input = fs::read_to_string("./inputs/day3.txt").expect("Could not read file"); println!("\tPart 1: {}", part1(&input)); - // println!("\tPart 2: {}", part2(&input)); + println!("\tPart 2: {}", part2(&input)); } fn part1(schematic: &str) -> usize { @@ -46,7 +46,46 @@ fn part1(schematic: &str) -> usize { sum_of_parts } -// fn part2(calibration_input: &str) -> usize {} +fn part2(schematic: &str) -> usize { + let mut sum_of_parts = 0; + let padded_schematic = format!(".\n{schematic}\n."); + let number_re = Regex::new(r"\d+").unwrap(); + let gear_re = Regex::new(r"\*").unwrap(); + let windows = padded_schematic + .lines() + .tuple_windows::<(_, _, _)>() + .collect::>(); + + for (top, middle, bottom) in windows { + for gear in gear_re.find_iter(middle) { + let search_range = std::ops::Range { + start: gear.range().end.saturating_sub(1), + end: gear.range().end + 1, + }; + + let mut numbers = vec![]; + for row in [top, middle, bottom] { + for num_match in number_re.find_iter(row) { + numbers.push(num_match); + } + } + + let mut geared_numbers = vec![]; + for number in numbers { + if std::cmp::max(number.range().start + 1, search_range.start) + <= std::cmp::min(number.range().end, search_range.end) + { + geared_numbers.push(number.as_str().parse::().unwrap()) + } + } + + if geared_numbers.len() == 2 { + sum_of_parts += geared_numbers[0] * geared_numbers[1]; + } + } + } + sum_of_parts +} #[cfg(test)] mod tests { @@ -68,16 +107,19 @@ mod tests { assert_eq!(part1(input), 4361); } - // #[test] - // fn test_2() { - // let input = "two1nine - // eightwothree - // abcone2threexyz - // xtwone3four - // 4nineeightseven2 - // zoneight234 - // 7pqrstsixteen"; + #[test] + fn test_2() { + let input = "467..114.. +...*...... +..35..633. +......#... +617*...... +.....+.58. +..592..... +......755. +...$.*.... +.664.598.."; - // assert_eq!(part2(input), 281); - // } + assert_eq!(part2(input), 467835); + } }