The Clockwise Spiral

Cette semaine, c'est Hicham qui vous propose un #KataOfTheWeek : The Clockwise Spiral

Briefing du Kata : L'objectif est de créer une fonction createSpiral(n) qui prend un nombre n et retourne un tableau à 2 dimensions n*n, où n*n représente la spirale. Si n = 1 ou n'est pas un nombre alors on retourne un tableau vide.

Par exemple : n = 3 le résultat est : [[1,2,3],[8,9,4],[7,6,5]]1    2    3

8    9    4

7    6    5

Saurez-vous résoudre le problème ?

Bon courage !


Et voici une solution proposée par l'auteur en Javascript :

const createSpiral = n => {
    if (!Number.isInteger(n) || n < 1) return []
    let returnArray = []

    for (let i = 0; i < n; i++) {
        returnArray[i] = Array(n)
    }

    let topBoundary = 0;
    let bottomBoundary = n-1;
    let leftBoundary = 0;
    let rightBoundary =  n-1;
    let counter = 1;
    let direction = 'LEFT';
    let x = 0;
    let y = 0;

    while (topBoundary <= bottomBoundary && leftBoundary <= rightBoundary) {
        if (direction === "LEFT" && x <= rightBoundary) {
            returnArray[y][x++] = counter++
        } else if (direction === "LEFT" && x > rightBoundary) {
            direction = "DOWN"
            x = rightBoundary
            y = ++topBoundary
        } else if (direction === 'DOWN' && y <= bottomBoundary) {
            returnArray[y++][x] = counter++
        } else if (direction === 'DOWN' && y > bottomBoundary) {
            direction = 'RIGHT'
            x = --rightBoundary
            y = bottomBoundary
        } else if (direction === 'RIGHT' && x >= leftBoundary) {
            returnArray[y][x--] = counter++
        } else if (direction === 'RIGHT' && x < leftBoundary) {
            direction = 'UP'
            x = leftBoundary
            y = --bottomBoundary
        }  else if (direction === 'UP' && y >= topBoundary) {
            returnArray[y--][x] = counter++
        } else if (direction === 'UP' && y < topBoundary) {
            direction = 'LEFT'
            x = ++leftBoundary
            y = topBoundary
        }
    }
    return returnArray
}

Votre équipe TakiVeille