use std::{collections::HashSet, fs}; fn main() { let file = fs::read_to_string("./input.txt").unwrap(); let mut rows = Vec::new(); for line in file.lines() { let vals = line .split_whitespace() .map(|x| x.parse::().unwrap()) .collect::>(); rows.push(vals); } println!("Solution 1: {}", puzzle1(rows.clone())); println!("Solution 2: {}", puzzle2(rows)); } fn puzzle1(rows: Vec>) -> i32 { let mut counter = 0; for r in rows { if is_safe(&r) { counter += 1; } } counter } fn puzzle2(rows: Vec>) -> i32 { let mut counter = 0; for r in rows { if is_safe(&r) { counter += 1; continue; } for i in 0..r.len() { let mut modrow = r.clone(); modrow.remove(i); if is_safe(&modrow) { counter += 1; break; } } } counter } fn is_safe(row: &[i32]) -> bool { let mut safeslopes: HashSet = HashSet::from_iter(vec![1, 2, 3]); let mut safenegslopes: HashSet = HashSet::from_iter(vec![-1, -2, -3]); for i in 1..row.len() { let diff = row[i] - row[i - 1]; safeslopes.insert(diff); safenegslopes.insert(diff); } safeslopes.len() == 3 || safenegslopes.len() == 3 }