rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;

impl Solution {
    fn circular_array_loop(mut nums: Vec<i32>) -> bool {
        let n = nums.len();
        for i in 0..n {
            if Self::next(&nums, i) == i {
                nums[i] = 0;
            }
        }
        for i in 0..n {
            if nums[i] == 0 {
                continue;
            }
            let mut slow = i;
            let mut fast = i;
            while nums[slow] * nums[Self::next(&nums, fast)] > 0
                && nums[slow] * nums[Self::next(&nums, Self::next(&nums, fast))] > 0
            {
                slow = Self::next(&nums, slow);
                fast = Self::next(&nums, Self::next(&nums, fast));
                if slow == fast {
                    return true;
                }
            }
            let mut j = i;
            let val = nums[i];
            while nums[j] * val > 0 {
                let next = Self::next(&nums, j);
                nums[j] = 0;
                j = next;
            }
        }
        false
    }

    fn next(nums: &[i32], index: usize) -> usize {
        let n = nums.len();
        let index = index as i32 + nums[index];
        let index = if index < 0 {
            n as i32 + (index % n as i32)
        } else {
            index % n as i32
        };
        (index as usize) % n
    }
}

#[test]
fn test() {
    let nums = vec![2, -1, 1, 2, 2];
    let res = true;
    assert_eq!(Solution::circular_array_loop(nums), res);
    let nums = vec![-1, 2];
    let res = false;
    assert_eq!(Solution::circular_array_loop(nums), res);
    let nums = vec![-2, 1, -1, -2, -2];
    let res = false;
    assert_eq!(Solution::circular_array_loop(nums), res);
    let nums = vec![-1];
    let res = false;
    assert_eq!(Solution::circular_array_loop(nums), res);
}