2022.05.13

Last update: 2022.05.13

Snail sort

I was looking for some file/s on my computer, but instead i found this:

//main.rs
fn main () {
    let mut res: Vec<i32> = Vec::new();
    let mut pos = "right";
    let mut vec_index = 0;
    let mut a = vec!(
                    vec![ 1,  2,  3,  4,  5, 6],
                    vec![20, 21, 22, 23, 24, 7],
                    vec![19, 32, 33, 34, 25, 8],
                    vec![18, 31, 100, 35, 26, 9],
                    vec![17, 30, 29, 28, 27, 10],
                    vec![16, 15, 14, 13, 12, 11],
                );
                
    while a.len() != 0 {
        if pos == "right" {
            let mut temp_vec = a.clone();
            for j in 0..a[vec_index].len() {
                res.push(a[vec_index][j]);
                temp_vec[vec_index]
                    .retain(|&x| x == a[vec_index][j]);
            }
            temp_vec.retain(|x| x.len() != 0 );
            a = temp_vec;
            pos = "down";
        } else if pos == "down" {
            let mut temp_vec = a.clone();
            res.push(a[vec_index][a[vec_index].len() - 1]);
            temp_vec[vec_index]
                .retain(|&x| x != a[vec_index][a[vec_index].len() - 1]);
            a = temp_vec;
            if vec_index + 1 == a.len() {
                pos = "left";
                continue;
            }
            vec_index += 1;
        } else if pos == "left" {
            let rev_temp: Vec<i32> = a[vec_index]
                                        .to_vec()
                                        .into_iter()
                                        .rev()
                                        .collect();
            for j in 0..rev_temp.len() {
                res.push(rev_temp[j]);
            }
            a.pop();
            pos = "up";
        } else if pos == "up" {
            vec_index -= 1;
            let mut temp_vec = a.clone();
            if vec_index == 0 {
                pos = "right";
                continue;
            } else {
                res.push(a[vec_index][0]);
                temp_vec[vec_index]
                    .retain(|&x| x != a[vec_index][0]);
                a = temp_vec;
                continue;
            }
        }
    }
    
    println!("{:?}", res);
}

So...I got distracted instead of looking the file/s that I supposed to find, I try to refactor this code 👍.

Anyway this algorithm is called snailsort algorithm


    SnailSort is an algorithm that takes an array of equal-length sub-arrays and then merges them into a 
    single array in a clockwise spiral, starting from the upper-left hand corner[1].

    ex: 
    [
      [1,2,3],
      [8,9,4],
      [7,6,5],
    ]

    return [1,2,3.4.5.6,7,8,9]

Yeah it's funny.Idk why i worked on snailsort, but i was having fun.


anyway here's the refactor result.Using Match for the routes and Enum to declare the routes avoiding hard coded way like pos="left" to make it looks cleaner, and i change about those clones fest man, damn look at those clones on my first attempt man we naruto now.Using VecDeque VecDeque<slice::Iter<i32>> i can easily pop, append/extend, and other manipulation that i want.


aaand i forgor about file/s that i supposed to looking for 💀.



References:

  1. https://medium.com/@spencerwhitehead7/snail-sort-the-gimmick-sort-goat-310510814eab