//! 263. Fixed-size chunks iteration
//!
//! `chunks(n)` splits a slice into non-overlapping sub-slices of at most n elements.
fn main() {
let data = [1i32, 2, 3, 4, 5, 6, 7];
println!("Chunks of 3:");
for chunk in data.chunks(3) {
println!(" {:?} (len={})", chunk, chunk.len());
}
let chunk_sums: Vec<i32> = data.chunks(3).map(|c| c.iter().sum()).collect();
println!("Chunk sums: {:?}", chunk_sums);
// chunks_exact: only full chunks, with remainder
let exact = data.chunks_exact(3);
let remainder = exact.remainder();
println!("Exact chunks of 3:");
for chunk in data.chunks_exact(3) {
println!(" {:?}", chunk);
}
println!("Remainder: {:?}", remainder);
let items: Vec<i32> = (1..=10).collect();
for (i, batch) in items.chunks(4).enumerate() {
let sum: i32 = batch.iter().sum();
println!("Batch {}: {:?} (sum={})", i, batch, sum);
}
// Matrix rows: flat array as 3-column matrix
let matrix: Vec<i32> = (1..=9).collect();
println!("Matrix (3 cols):");
for row in matrix.chunks(3) {
println!(" {:?}", row);
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_chunks_basic() {
let data = [1i32, 2, 3, 4, 5];
let chunks: Vec<&[i32]> = data.chunks(2).collect();
assert_eq!(chunks.len(), 3);
assert_eq!(chunks[0], &[1, 2]);
assert_eq!(chunks[2], &[5]);
}
#[test]
fn test_chunks_exact_remainder() {
let data = [1i32, 2, 3, 4, 5];
let exact = data.chunks_exact(2);
assert_eq!(exact.remainder(), &[5]);
}
#[test]
fn test_chunks_divisible() {
let data = [1i32, 2, 3, 4];
let chunks: Vec<_> = data.chunks(2).collect();
assert_eq!(chunks.len(), 2);
assert!(chunks.iter().all(|c| c.len() == 2));
}
}
(* 263. Fixed-size chunks iteration - OCaml *)
let chunks n lst =
let rec aux acc current count = function
| [] ->
if current = [] then List.rev acc
else List.rev (List.rev current :: acc)
| x :: xs ->
if count = n then aux (List.rev current :: acc) [x] 1 xs
else aux acc (x :: current) (count + 1) xs
in
aux [] [] 0 lst
let () =
let nums = [1; 2; 3; 4; 5; 6; 7] in
let cs = chunks 3 nums in
Printf.printf "Chunks of 3:\n";
List.iter (fun chunk ->
Printf.printf "[%s]\n" (String.concat "; " (List.map string_of_int chunk))
) cs;
let sums = List.map (List.fold_left (+) 0) cs in
Printf.printf "Chunk sums: %s\n"
(String.concat ", " (List.map string_of_int sums));
let batches = chunks 4 (List.init 10 (fun i -> i + 1)) in
List.iteri (fun i batch ->
Printf.printf "Batch %d: [%s]\n" i
(String.concat ", " (List.map string_of_int batch))
) batches