diff options
| author | nekineki <nekineki@nekineki.net> | 2024-12-02 19:05:55 +0100 |
|---|---|---|
| committer | nekineki <nekineki@nekineki.net> | 2024-12-02 19:05:55 +0100 |
| commit | c18ea4b9e5db4dd56a915994f30b7e6841540024 (patch) | |
| tree | 8cca78aad31f1ca0c5b949b604e6d8c39e638950 /2024/day02.rs | |
| parent | fbcd6fc3b796339b9caf636d8864934086d09afe (diff) | |
day02
Diffstat (limited to '2024/day02.rs')
| -rw-r--r-- | 2024/day02.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/2024/day02.rs b/2024/day02.rs new file mode 100644 index 0000000..c32aa19 --- /dev/null +++ b/2024/day02.rs @@ -0,0 +1,55 @@ +#![allow(dead_code)] +#![allow(unused_variables)] +#![allow(unused_mut)] +use std::env; +use std::fs::File; +use std::io::Read; + +fn is_all_same(arr: &[bool]) -> bool { + arr.windows(2).all(|w| w[0] == w[1]) +} + +fn is_safe(arr: &[i32]) -> bool { + let diff: Vec<i32> = 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 = is_all_same(&diff.iter().map(|a| *a > 0).collect::<Vec<_>>()); + + inc_ok && sign_ok +} +fn main() { + let args: Vec<String> = 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<i32> = 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); +} |
