static DAY: u8 = 2; fn main() { let input = advent::read_lines(DAY); println!("{DAY}a: {}", safe_reports(&input, false)); println!("{DAY}b: {}", safe_reports(&input, true)); } fn is_report_safe(report: &[i32]) -> bool { let increasing = report[1] - report[0] > 0; for number in report.iter().as_slice().windows(2) { let diff = number[1] - number[0]; if diff.abs() < 1 || diff.abs() > 3 { return false; } if (diff > 0) != increasing { return false; } } true } fn safe_reports(input: &[String], with_dampener: bool) -> usize { let mut reports = Vec::new(); for line in input { let numbers = line.split(" ") .map(|x| x.parse::().unwrap()) .collect::>(); reports.push(numbers); } let mut count = 0; for report in reports { if is_report_safe(&report) { count += 1; } else if with_dampener { for i in 0 .. report.len() { let mut dampened = report.clone(); dampened.remove(i); if is_report_safe(&dampened) { count += 1; break; } } } } count } #[cfg(test)] mod tests { use super::*; #[test] fn test() { let input = [ "7 6 4 2 1", "1 2 7 8 9", "9 7 6 2 1", "1 3 2 4 5", "8 6 4 4 1", "1 3 6 7 9", ].iter().map(|&x| String::from(x)).collect::>(); assert_eq!(safe_reports(&input, false), 2); assert_eq!(safe_reports(&input, true), 4); } }