100-days-of-rust/Week-02/Day-12_Mountains_And_Valleys/day12/src/lib.rs

70 lines
1.6 KiB
Rust
Raw Normal View History

2024-08-06 14:20:08 +00:00
pub enum LandscapeType {
Mountain,
Valley,
Neither,
}
fn is_mountain(numbers: &[isize], max: (usize, &isize)) -> bool {
if max.0 > 0 && max.0 < numbers.len() - 1 {
for (i, n) in numbers[1..max.0].iter().enumerate() {
if numbers[i] > *n {
return false;
}
}
for (i, n) in numbers[1 + max.0..numbers.len() - 1].iter().enumerate() {
if *n > numbers[max.0 + i] {
return false;
}
}
true
} else {
false
}
}
fn is_valley(numbers: &[isize], min: (usize, &isize)) -> bool {
if min.0 > 0 && min.0 < numbers.len() - 1 {
for (i, n) in numbers[1..min.0].iter().enumerate() {
if numbers[i] < *n {
return false;
}
}
for (i, n) in numbers[1 + min.0..numbers.len()].iter().enumerate() {
if *n < numbers[min.0 + i] {
return false;
}
}
true
} else {
false
}
}
pub fn landscape_type(numbers: &[isize]) -> LandscapeType {
if numbers.is_empty() {
return LandscapeType::Neither;
}
let mut min = (usize::MAX, &isize::MAX);
let mut max = (usize::MIN, &isize::MIN);
for (i, n) in numbers.iter().enumerate() {
if n < min.1 {
min = (i, n);
}
if n > max.1 {
max = (i, n);
}
}
if is_mountain(numbers, max) {
LandscapeType::Mountain
} else if is_valley(numbers, min) {
LandscapeType::Valley
} else {
LandscapeType::Neither
}
}