//! 262. Sliding windows over slices
//!
//! `windows(n)` yields overlapping sub-slices of length `n`, zero-copy.
fn main() {
let data = [1i32, 2, 3, 4, 5];
println!("Windows of 3:");
for w in data.windows(3) {
println!(" {:?}", w);
}
let window_size = 3;
let moving_avg: Vec<f64> = data.windows(window_size)
.map(|w| w.iter().sum::<i32>() as f64 / window_size as f64)
.collect();
println!("Moving averages (k=3): {:?}", moving_avg);
let is_increasing = data.windows(2).all(|w| w[0] < w[1]);
println!("Strictly increasing: {}", is_increasing);
let signal = [1i32, 3, 2, 5, 4, 6, 2];
let local_max: Vec<usize> = signal.windows(3)
.enumerate()
.filter(|(_, w)| w[1] > w[0] && w[1] > w[2])
.map(|(i, _)| i + 1)
.collect();
println!("Local maxima at indices: {:?}", local_max);
let words = ["the", "quick", "brown", "fox"];
let bigrams: Vec<_> = words.windows(2).collect();
println!("Bigrams: {:?}", bigrams);
}
#[cfg(test)]
mod tests {
#[test]
fn test_windows_count() {
let data = [1i32, 2, 3, 4, 5];
assert_eq!(data.windows(3).count(), 3);
}
#[test]
fn test_windows_moving_avg() {
let data = [1i32, 2, 3, 4, 5];
let avgs: Vec<f64> = data.windows(2)
.map(|w| w.iter().sum::<i32>() as f64 / 2.0)
.collect();
assert_eq!(avgs, vec![1.5, 2.5, 3.5, 4.5]);
}
#[test]
fn test_windows_sorted_check() {
let sorted = [1i32, 2, 3, 4];
assert!(sorted.windows(2).all(|w| w[0] <= w[1]));
let unsorted = [1i32, 3, 2, 4];
assert!(!unsorted.windows(2).all(|w| w[0] <= w[1]));
}
}
(* 262. Sliding windows over slices - OCaml *)
let windows n arr =
let len = Array.length arr in
if n > len then [||]
else Array.init (len - n + 1) (fun i -> Array.sub arr i n)
let () =
let arr = [|1; 2; 3; 4; 5|] in
let ws = windows 3 arr in
Printf.printf "Windows of 3:\n";
Array.iter (fun w ->
Printf.printf "[%s]\n"
(String.concat "; " (Array.to_list (Array.map string_of_int w)))
) ws;
let k = 3 in
let avgs = Array.map (fun window ->
let sum = Array.fold_left (+) 0 window in
float_of_int sum /. float_of_int k
) (windows k arr) in
Printf.printf "Moving averages: %s\n"
(String.concat ", "
(Array.to_list (Array.map (Printf.sprintf "%.1f") avgs)));
let pairs = windows 2 arr in
let increasing = Array.for_all (fun w -> w.(0) < w.(1)) pairs in
Printf.printf "Monotonically increasing: %b\n" increasing