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 } }