spiralMatrix codeEval

by Igor Cuckovic

JavaScript

var spiralMatrix = function (line) {
    var arr = line.split(';');
    var y = +arr[0];
    var x = +arr[1];
    var list = arr[2].split(' ');

    var calculatePositions = function (width, height) {
        var myArray = [];
        
        var generateTopRight = function (x1, y1, x2, y2) {
            for (i = x1; i <= x2; i += 1) {
                //myArray.push([i, y1]);
                if ((width * (y1 - 1) + i) - 1 <= list.length - 1) {
                    myArray.push(list[(width * (y1 - 1) + i) - 1]);
                }
            }
            for (j = y1 + 1; j <= y2; j += 1) {
                //myArray.push([x2, j]);
                if ((width * (j - 1) + x2) - 1 <= list.length - 1) {
                    myArray.push(list[(width * (j - 1) + x2) - 1]);
                }
            }
            if ((x2 - x1) && (y2 - y1) > 0) {
                generateBottomLeft(x1, y1 + 1, x2 - 1, y2);
            }
        };
        
        var generateBottomLeft = function (x1, y1, x2, y2) {
            for (i = x2; i >= x1; i -= 1) {
                //myArray.push([i, y2]);
                if ((width * (y2 - 1) + i) - 1 <= list.length - 1) {
                    myArray.push(list[(width * (y2 - 1) + i) - 1]);
                }
            }
            for (j = y2 - 1; j >= y1; j -= 1) {
                //myArray.push([x1, j]);
                if ((width * (j - 1) + x1) - 1 <= list.length - 1) {
                    myArray.push(list[(width * (j - 1) + x1) - 1]);
                }
            }
            if ((x2 - x1) && (y2 - y1) > 0) {
                generateTopRight(x1 + 1, y1, x2, y2 - 1);
            }
        };

        generateTopRight(1, 1, width, height);
        return myArray;
    };

    return calculatePositions(x, y);
}

console.log(spiralMatrix("2;3;1 2 3 4 5 6 7 8").join(' '));