#![allow(dead_code)] #![allow(unused_variables)] #![allow(unused_mut)] use std::env; use std::fs::File; use std::io::Read; use itertools::Itertools; fn is_safe(arr: &[i32]) -> bool { let diff: Vec = arr.windows(2).map(|w| w[0] - w[1]).collect(); let inc_ok = diff .iter() .map(|a| (3 >= a.abs()) && (a.abs() >= 1)) .all(|a| a); let sign_ok = diff.iter().map(|a| *a > 0).all_equal(); inc_ok && sign_ok } fn main() { let args: Vec = env::args().collect(); let filename = if args.len() == 1 { "in/".to_owned() + args[0].split('/').last().unwrap() + ".pzl" } else { args[1].clone() }; let mut f = File::open(filename).expect("cannot open file"); let mut content = String::new(); f.read_to_string(&mut content).expect("cannot read file"); let lines = content.trim_end().split("\n"); let mut res1 = 0; let mut res2 = 0; for line in lines { let a: Vec = line.split(" ").map(|a| a.parse().unwrap()).collect(); if is_safe(&a) { res1 += 1; res2 += 1; } else { for i in 0..a.len() { let mut b = a.clone(); b.remove(i); if is_safe(&b) { res2 += 1; break; } } } } println!("res1: {}", res1); println!("res2: {}", res2); assert_eq!(res1, 257); assert_eq!(res2, 328); }