代码
use rand::{thread_rng, Rng};
fn main() {
let mut vec = vec![1, 2, 3, 4, 1, 2, 3, 4];
let mut rng = thread_rng();
println!("{:?} 初始状态", vec);
swap(&mut vec, rng.gen_range(2..=7));
println!("{:?} 拿走头名字长度(2-7)刺进尾部 (怎样变n 4都会相同)", vec);
let tmp: Vec<_> = vec.drain(..3).collect();
let index = rng.gen_range(1..vec.len() - 1);
vec.splice(index..index, tmp);
println!("{vec:?} 拿走头3张刺进中心 (插到4-8之间刚好首尾相同)");
let target = vec.remove(0);
println!("{vec:?} 拿走首牌 {target} (尾不变)");
let tmp: Vec<_> = vec.drain(..rng.gen_range(1..=3)).collect();
let index = rng.gen_range(1..vec.len() - 1);
vec.splice(index..index, tmp);
println!("{vec:?} 南1 北2 不清楚3 刺进中心 (尾不变)");
vec.drain(..rng.gen_range(1..=2));
println!("{vec:?} 男1 女2 删去 (尾不变)");
swap(&mut vec, 7);
println!("{vec:?} 见证奇观的时间 (尾牌: 男倒2 女倒3)");
while vec.len() > 1 {
let tmp = vec.remove(0);
vec.push(tmp);
vec.remove(0);
println!("{vec:?} 好运留下来烦恼丢出去")
}
assert_eq!(target, vec.remove(0))
}
fn swap<T>(vec: &mut Vec<T>, n: usize) {
for _ in 0..n {
let val = vec.remove(0);
vec.push(val)
}
}
结果
[1, 2, 3, 4, 1, 2, 3, 4] 初始状态
[3, 4, 1, 2, 3, 4, 1, 2] 拿走头名字长度(2-7)刺进尾部 (怎样变n 4都会相同)
[2, 3, 4, 1, 3, 4, 1, 2] 拿走头3张刺进中心 (插到4-8之间刚好首尾相同)
[3, 4, 1, 3, 4, 1, 2] 拿走首牌 2 (尾不变)
[3, 4, 3, 4, 1, 1, 2] 南1 北2 不清楚3 刺进中心 (尾不变)
[4, 3, 4, 1, 1, 2] 男1 女2 删去 (尾不变)
[3, 4, 1, 1, 2, 4] 见证奇观的时间 (尾牌: 男倒2 女倒3)
[1, 1, 2, 4, 3] 好运留下来烦恼丢出去
[2, 4, 3, 1] 好运留下来烦恼丢出去
[3, 1, 2] 好运留下来烦恼丢出去
[2, 3] 好运留下来烦恼丢出去
[2] 好运留下来烦恼丢出去
原理