解答

  1. /// Calculate the differences between elements of `values` offset by `offset`,
  2. /// wrapping around from the end of `values` to the beginning.
  3. ///
  4. /// Element `n` of the result is `values[(n+offset)%len] - values[n]`.
  5. fn offset_differences<N>(offset: usize, values: Vec<N>) -> Vec<N>
  6. where
  7. N: Copy + std::ops::Sub<Output = N>,
  8. {
  9. let a = (&values).into_iter();
  10. let b = (&values).into_iter().cycle().skip(offset);
  11. a.zip(b).map(|(a, b)| *b - *a).collect()
  12. }
  13. #[test]
  14. fn test_offset_one() {
  15. assert_eq!(offset_differences(1, vec![1, 3, 5, 7]), vec![2, 2, 2, -6]);
  16. assert_eq!(offset_differences(1, vec![1, 3, 5]), vec![2, 2, -4]);
  17. assert_eq!(offset_differences(1, vec![1, 3]), vec![2, -2]);
  18. }
  19. #[test]
  20. fn test_larger_offsets() {
  21. assert_eq!(offset_differences(2, vec![1, 3, 5, 7]), vec![4, 4, -4, -4]);
  22. assert_eq!(offset_differences(3, vec![1, 3, 5, 7]), vec![6, -2, -2, -2]);
  23. assert_eq!(offset_differences(4, vec![1, 3, 5, 7]), vec![0, 0, 0, 0]);
  24. assert_eq!(offset_differences(5, vec![1, 3, 5, 7]), vec![2, 2, 2, -6]);
  25. }
  26. #[test]
  27. fn test_custom_type() {
  28. assert_eq!(
  29. offset_differences(1, vec![1.0, 11.0, 5.0, 0.0]),
  30. vec![10.0, -6.0, -5.0, 1.0]
  31. );
  32. }
  33. #[test]
  34. fn test_degenerate_cases() {
  35. assert_eq!(offset_differences(1, vec![0]), vec![0]);
  36. assert_eq!(offset_differences(1, vec![1]), vec![0]);
  37. let empty: Vec<i32> = vec![];
  38. assert_eq!(offset_differences(1, empty), vec![]);
  39. }
  40. fn main() {}