fn rotate(array: &mut [usize], start: usize) { array.swap(start, start + 1); array.swap(start + 1, start + 2); } pub fn larry_array(mut array: Vec) -> Result { let mut next = 1; while next <= array.len() { let mut index = match array.iter().position(|&e| e == next) { Some(x) => x, None => { return Err( "The array must contains all the numbers from 1 to the array's length" .to_owned(), ); } }; if index != next - 1 && next == array.len() - 1 { return Ok(false); } while index != next - 1 { let start = std::cmp::max(index - 2, next - 1); let end = start + 2; rotate(&mut array, start); index = (end + index - 1) % end; } next += 1; } Ok(true) }