day 2: part2: rust
This commit is contained in:
parent
9fe58d5490
commit
612bd4313f
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "part1"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
|
@ -0,0 +1,73 @@
|
||||||
|
use std::u64;
|
||||||
|
|
||||||
|
|
||||||
|
fn is_increasing(levels: &Vec<u64>) -> bool {
|
||||||
|
let mut current = 0;
|
||||||
|
for item in levels {
|
||||||
|
if *item < current {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
current = *item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_decreasing(levels: &Vec<u64>) -> 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<u64>) -> bool {
|
||||||
|
return is_increasing(levels) || is_decreasing(levels);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_safe(levels: &Vec<u64>) -> 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 is_safe_but_one(levels: &Vec<u64>) -> bool {
|
||||||
|
if is_safe(levels) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for i in 0..(levels.len()) {
|
||||||
|
let mut levels_but_one = levels.clone();
|
||||||
|
levels_but_one.remove(i);
|
||||||
|
if is_safe(&levels_but_one) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> std::io::Result<()> {
|
||||||
|
let mut count = 0;
|
||||||
|
for line in std::io::stdin().lines() {
|
||||||
|
let line = line.unwrap();
|
||||||
|
let levels: Vec<u64> = line.split(" ").map(|x| x.parse::<u64>().unwrap()).collect();
|
||||||
|
if is_safe_but_one(&levels) {
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", count);
|
||||||
|
Ok(())
|
||||||
|
}
|
Loading…
Reference in New Issue