diff --git a/src/day02.rs b/src/day02.rs index 61fb6fd..7e3b834 100644 --- a/src/day02.rs +++ b/src/day02.rs @@ -1,11 +1,11 @@ -use std::fs::read_to_string; +use std::{default, fs::read_to_string}; use itertools::Itertools; pub fn day_main() { let input = read_to_string("input/day02.txt").unwrap(); println!("part1: {}", part1(&input)); - // println!("part2: {}", part2(&input)); + println!("part2: {}", part2(&input)); } fn part1(input: &str) -> usize { @@ -16,21 +16,43 @@ fn part1(input: &str) -> usize { .map(|s| s.parse::().unwrap()) .collect_vec() }) - .filter(|report: &Vec| { - let pairs = report - .windows(2) - .map(|window| window[1] - window[0]) - .collect_vec(); - let steepest_slope = pairs.iter().map(|x| x.abs()).max().unwrap(); - let lowest_slope = pairs.iter().map(|x| x.abs()).min().unwrap(); - let same_sign = pairs.iter().map(|x| x.signum()).unique().count() == 1; - println!("{:?} - {steepest_slope}/{same_sign}", report); + .filter(|report: &Vec| is_safe(report)) + .count() +} - steepest_slope <= 3 && lowest_slope >= 1 && same_sign +fn part2(input: &str) -> usize { + input + .lines() + .map(|line| { + line.split_whitespace() + .map(|s| s.parse::().unwrap()) + .collect_vec() + }) + .filter(|report: &Vec| { + (0..report.len()).any(|del| { + let without = report + .iter() + .enumerate() + .filter_map(|(i, e)| if del != i { Some(*e) } else { None }) + .collect_vec(); + is_safe(&without) + }) }) .count() } +fn is_safe(report: &[i32]) -> bool { + let pairs = report + .windows(2) + .map(|window| window[1] - window[0]) + .collect_vec(); + let steepest_slope = pairs.iter().map(|x| x.abs()).max().unwrap(); + let lowest_slope = pairs.iter().map(|x| x.abs()).min().unwrap(); + let same_sign = pairs.iter().map(|x| x.signum()).unique().count() == 1; + + steepest_slope <= 3 && lowest_slope >= 1 && same_sign +} + // fn part2(input: &str) -> Int { // 0 // }