topics/spiral-matrix/index.js   A
last analyzed

Complexity

Total Complexity 20
Complexity/F 6.67

Size

Lines of Code 102
Function Count 3

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 20
eloc 56
mnd 17
bc 17
fnc 3
dl 0
loc 102
rs 10
bpm 5.6666
cpm 6.6666
noi 0
c 0
b 0
f 0
1
    const visitedPosition = (col, row, result) => {
2
        return (result[row] !== undefined && result[row][(col)] !== undefined);
3
    }
4
5
    const spiral = (num, val = 1, col = 0, row = 0, horizontal = true, result = [
6
        []
7
    ]) => {
8
        // put your code here to address problems
9
        if (num < 1) {
10
            return [
11
                []
12
            ];
13
        }
14
15
        if (!result[row]) {
16
            result[row] = [];
17
        }
18
19
        result[row][col] = val;
20
        if (val === Math.pow(num, 2)) {
21
            return result;
22
        }
23
        if (horizontal) {
24
            if ((col + 1) < num && !visitedPosition(col + 1, row, result)) {
25
                // go right
26
                return spiral(num, val + 1, col + 1, row, true, result);
27
            }
28
            if ((col - 1) >= 0 && !visitedPosition(col - 1, row, result)) {
29
                // go left
30
                return spiral(num, val + 1, col - 1, row, true, result);
31
            }
32
            if ((row + 1) < num && !visitedPosition(col, row + 1, result)) {
33
                // go down
34
                return spiral(num, val + 1, col, row + 1, false, result);
35
            }
36
            // go up
37
            return spiral(num, val + 1, col, row - 1, false, result);
38
39
        }
40
41
        if ((row + 1) < num && !visitedPosition(col, row + 1, result)) {
42
            // go down
43
            return spiral(num, val + 1, col, row + 1, false, result);
44
        }
45
        if ((row - 1) >= 0 && !visitedPosition(col, row - 1, result)) {
46
            // go up
47
            return spiral(num, val + 1, col, row - 1, false, result);
48
        }
49
        if ((col + 1) < num && !visitedPosition(col + 1, row, result)) {
50
            // go right
51
            return spiral(num, val + 1, col + 1, row, true, result);
52
        }
53
        // go left
54
        return spiral(num, val + 1, col - 1, row, true, result);
55
    }
56
57
    const spiral2 = num => {
58
        let result = [],
59
            startCol = 0,
60
            endCol = num - 1,
61
            startRow = 0,
62
            endRow = num - 1,
63
            counter = 1;
64
        if (num < 1) {
65
            return [
66
                []
67
            ];
68
        }
69
70
        for (let i = 0; i < num; i++) {
71
            result.push([]);
72
        }
73
74
        while (startCol <= endCol && startRow <= endRow) {
75
            // go right
76
            for (let i = startCol; i <= endCol; i++) {
77
                result[startRow][i] = counter++;
78
            }
79
            startRow++;
80
            //go down
81
            for (let i = startRow; i <= endRow; i++) {
82
                result[i][endCol] = counter++;
83
            }
84
            endCol--;
85
            //go left
86
            for (let i = endCol; i >= startCol; i--) {
87
                result[endRow][i] = counter++;
88
            }
89
            endRow--;
90
            // go up
91
            for (let i = endRow; i >= startRow; i--) {
92
                result[i][startCol] = counter++;
93
            }
94
            startCol++;
95
        }
96
        return result;
97
    }
98
99
    module.exports = {
100
        spiral,
101
        spiral2
102
    };