Упражнение: Цепочка вычислений
В этом упражнении вам нужно найти и использовать некоторые из предоставленных методов трейта Iterator, чтобы реализовать сложное вычисление.
Скопируйте следующий код на https://play.rust-lang.org/ и добейтесь прохождения тестов. Используйте выражение-итератор и collect, чтобы построить возвращаемое значение.
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
/// Вычисляет разности между элементами `values`, смещёнными на `offset`,
/// переходя от конца `values` к началу.
///
/// Элемент `n` результата равен `values[(n+offset)%len] - values[n]`.
fn offset_differences(offset: usize, values: Vec<i32>) -> Vec<i32> {
todo!()
}
#[test]
fn test_offset_one() {
assert_eq!(offset_differences(1, vec![1, 3, 5, 7]), vec![2, 2, 2, -6]);
assert_eq!(offset_differences(1, vec![1, 3, 5]), vec![2, 2, -4]);
assert_eq!(offset_differences(1, vec![1, 3]), vec![2, -2]);
}
#[test]
fn test_larger_offsets() {
assert_eq!(offset_differences(2, vec![1, 3, 5, 7]), vec![4, 4, -4, -4]);
assert_eq!(offset_differences(3, vec![1, 3, 5, 7]), vec![6, -2, -2, -2]);
assert_eq!(offset_differences(4, vec![1, 3, 5, 7]), vec![0, 0, 0, 0]);
assert_eq!(offset_differences(5, vec![1, 3, 5, 7]), vec![2, 2, 2, -6]);
}
#[test]
fn test_degenerate_cases() {
assert_eq!(offset_differences(1, vec![0]), vec![0]);
assert_eq!(offset_differences(1, vec![1]), vec![0]);
let empty: Vec<i32> = vec![];
assert_eq!(offset_differences(1, empty), vec![]);
}