init
commit
f3645427b8
|
@ -0,0 +1 @@
|
|||
/target
|
|
@ -0,0 +1,7 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "peak-and-valley"
|
||||
version = "0.1.0"
|
|
@ -0,0 +1,6 @@
|
|||
[package]
|
||||
name = "peak-and-valley"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
|
@ -0,0 +1,75 @@
|
|||
#[derive(PartialEq, Debug)]
|
||||
enum Order {
|
||||
Up,
|
||||
Down,
|
||||
Stable,
|
||||
Uninit,
|
||||
}
|
||||
|
||||
fn find_peaks_and_valleys(values: &[isize]) -> Vec<usize> {
|
||||
let mut peaks_and_valleys = vec![];
|
||||
let mut order = Order::Uninit;
|
||||
for i in 1..values.len() {
|
||||
let previous = values[i - 1];
|
||||
let current = values[i];
|
||||
|
||||
let new_order = match current - previous {
|
||||
0 => Order::Stable,
|
||||
x if x > 0 => Order::Up,
|
||||
x if x < 0 => Order::Down,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
|
||||
println!(
|
||||
"Compared {previous} ({}) and {current} ({}). Current order is {order:?}, new order is {new_order:?}",
|
||||
i - 1,
|
||||
i
|
||||
);
|
||||
|
||||
if order != new_order && order != Order::Uninit {
|
||||
peaks_and_valleys.push(i);
|
||||
println!("Order changed, pushing {}", i)
|
||||
}
|
||||
order = new_order;
|
||||
}
|
||||
|
||||
peaks_and_valleys
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("Hello, world!");
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
pub fn test() {
|
||||
assert_eq!(
|
||||
find_peaks_and_valleys(&[1, 2, 1, 3, 4, 5, 4, 5, 2, 1, 2, 3]),
|
||||
vec![1, 2, 5, 9]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
pub fn test_flat() {
|
||||
assert_eq!(find_peaks_and_valleys(&[1, 1, 1, 1]), vec![]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
pub fn test_up_and_down() {
|
||||
assert_eq!(
|
||||
find_peaks_and_valleys(&[1, 0, 1, 0, 1, 0]),
|
||||
vec![1, 2, 3, 4, 5]
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
pub fn test_negative() {
|
||||
assert_eq!(
|
||||
find_peaks_and_valleys(&[-5, -10, -7, -15, -12]),
|
||||
vec![1, 2, 3]
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue