70 lines
1.6 KiB
Rust
70 lines
1.6 KiB
Rust
|
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
|
||
|
}
|
||
|
}
|