diff --git a/2024/days/02/part1/Cargo.toml b/2024/days/02/part1/Cargo.toml new file mode 100644 index 0000000..d85b608 --- /dev/null +++ b/2024/days/02/part1/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "part1" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/2024/days/02/part1/src/main.rs b/2024/days/02/part1/src/main.rs new file mode 100644 index 0000000..a6a0efe --- /dev/null +++ b/2024/days/02/part1/src/main.rs @@ -0,0 +1,59 @@ +use std::u64; + + +fn is_increasing(levels: &Vec) -> bool { + let mut current = 0; + for item in levels { + if *item < current { + return false; + } else { + current = *item; + } + } + return true; +} + +fn is_decreasing(levels: &Vec) -> bool { + let mut current = u64::MAX; + for item in levels { + if *item > current { + return false; + } else { + current = *item; + } + } + return true; +} + +fn is_monotonous(levels: &Vec) -> bool { + return is_increasing(levels) || is_decreasing(levels); +} + +fn is_safe(levels: &Vec) -> bool { + if !is_monotonous(levels) { + return false; + } + for i in 0..(levels.len() - 1) { + let j = i+1; + let a = levels[i]; + let b = levels[j]; + let diff = (a as i64 - b as i64).abs() as u64; + if diff < 1 || diff > 3 { + return false; + } + } + return true; +} + +fn main() -> std::io::Result<()> { + let mut count = 0; + for line in std::io::stdin().lines() { + let line = line.unwrap(); + let levels: Vec = line.split(" ").map(|x| x.parse::().unwrap()).collect(); + if is_safe(&levels) { + count += 1; + } + } + println!("{}", count); + Ok(()) +} \ No newline at end of file