DEV Community

Discussion on: Daily Challenge #122 - Clockwise Spirals

Collapse
 
idanarye profile image
Idan Arye • Edited

Rust:

fn create_spiral(diameter: usize) -> Vec<Vec<usize>> {
    let move_pos = |pos: [isize; 2], direction: [isize; 2]| [
        pos[0] + direction[0],
        pos[1] + direction[1],
    ];

    let mut result = vec![vec![0; diameter]; diameter];
    let mut pos = [0, 0];
    let directions = [
        [1, 0],
        [0, 1],
        [-1, 0],
        [0, -1]
    ];

    let mut direction = 0;
    for i in 1..=diameter.pow(2) {
        result[pos[1] as usize][pos[0] as usize] = i;
        let new_pos = move_pos(pos, directions[direction]);
        let should_turn =
            new_pos[0] < 0 || new_pos[1] < 0 ||
            diameter <= new_pos[0] as usize || diameter <= new_pos[1] as usize ||
            result[new_pos[1] as usize][new_pos[0] as usize] != 0;
        if should_turn {
            direction = (direction + 1) % directions.len();
            pos = move_pos(pos, directions[direction]);
        } else {
            pos = new_pos;
        }
    }
    result
}

fn main() {
    for row in create_spiral(10) {
        for cell in row {
            print!("{:4}", cell);
        }
        println!();
    }
}