1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
pub fn riffle_shuffle<T: Clone>(input: &[T]) -> Vec<T> {
assert!(
input.len() % 2 == 0,
"Method only defined for even number of elements"
);
let mid = input.len() / 2;
let (left, right) = input.split_at(mid);
let mut out = Vec::<T>::with_capacity(input.len());
for i in 0..mid {
out.push(right[i].clone());
out.push(left[i].clone());
}
out
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn riffle_shuffle_works() {
let start = [0xA, 0x2, 0x3, 0x4, 0x5, 0x6];
let round1 = riffle_shuffle(&start);
assert_eq!(round1, [0x4, 0xA, 0x5, 0x2, 0x6, 0x3]);
let round2 = riffle_shuffle(&round1);
assert_eq!(round2, [0x2, 0x4, 0x6, 0xA, 0x3, 0x5]);
let round3 = riffle_shuffle(&round2);
assert_eq!(round3, start);
let original = [12, 33, 76, 576, 0, 44, 1, 14, 78, 99, 871212, -7, 2, -1];
let mut result = Vec::from(original);
for _ in 0..4 {
result = riffle_shuffle(&result);
}
assert_eq!(result, original);
let original = [
7, 4, 2, 4656, 23, 45, 23, 1, 12, 76, 576, 0, 12, 1, 14, 78, 99, 12, 1212, 444, 31,
111, 424, 34,
];
let mut result = Vec::from(original);
for _ in 0..20 {
result = riffle_shuffle(&result);
}
assert_eq!(result, original);
}
}