演習: イテレータのメソッドチェーン

この演習では、複雑な計算を実装するためにIterator トレイトで提供されているメソッドをいくつかを探して使用する必要があります。

次のコードを https://play.rust-lang.org/ にコピーし、テストが通るようにしてください。イテレータ式を使用し、その結果をcollectすることで戻り値を生成します。

#![allow(unused)]
fn main() {
/// `values`において、`offset`だけ離れた要素間の差を計算します。
/// なお、`values`の末尾要素の次は先頭へ戻ることとします。
///
/// 結果の要素 `n` は `values[(n+offset)%len] - values[n]` です。
fn offset_differences(offset: usize, values: Vec<i32>) -> Vec<i32> {
    unimplemented!()
}

#[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![]);
}
}