commit f3645427b81e8c526af7f281d18eb689f0b36b44 Author: Eric Fistons Date: Wed Jun 11 23:54:18 2025 +0200 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..168d0be --- /dev/null +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..acfbfc5 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "peak-and-valley" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..55a9453 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,75 @@ +#[derive(PartialEq, Debug)] +enum Order { + Up, + Down, + Stable, + Uninit, +} + +fn find_peaks_and_valleys(values: &[isize]) -> Vec { + 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] + ); + } +}