R
E
A
C
T
O
xamples
epeat
ode
pproach
ptimize
est
Spiral Jetty
The Question
Write a function that will generate a spiral
of the form below:
resultArray = [[0,0],[1,0],[1,1],[0,1],[-1,1],[-1,0],...,[-2,-1],[-2,-2]]
var spiral = function(n){
var direction;
x=0;
y=0;
resultArray = [[0,0]]
for (var k=1; k < n; k++){
direction = k%2;
if (direction === 1){
// Move to the right then move up
}
if (direction === 0){
// Move to the left then move down
}
}
return resultArray;
}
k = 1 : [[0,0],[1,0],[1,1]]
k = 2 : [[0,0],[1,0],[1,1], ]
[0,1],[-1,1],[-1,0],[-1,-1]
k=1
k=1
k=2
k=2
|
|
|
|
|
|
|
Approach
- for each k, you take
k steps in both the x
and y direction
- alternate between
+ and - direction
for (var k=1; k < n; k++){
direction = k%2;
if (direction === 1){
var i = 0;
var j = 0;
while(i < k){
x++;
resultArray.push([x,y]);
i++
}
while(j < k){
y++;
resultArray.push([x,y])
j++
}
}
if (direction === 0){
var i = 0;
var j = 0;
while (i < k){
x--;
resultArray.push([x,y]);
i++;
}
while (j < k){
y--;
resultArray.push([x,y]);
j++
}
}
}
- x and y represent
the coordinates
- i and j control the
number of steps taken
i = 0
i = 0
i = 1
j = 0
j = 0
j = 1
i = 1
i = 0
i = 2
Approach
Full Solution
Another Solution
'use strict';
var spiral = function(maxLength){
var xPos=0;
var yPos=0;
var resultArray = [[0,0]];
//each large iteration creates an 'L' of the spiral
for (let thisLength = 1; thisLength < maxLength; thisLength++){
//control ++ or -- vertically and horizontally
var goPositive = thisLength % 2;
//iterate horizontally left or right
for (let xIterator = 0; xIterator < thisLength; xIterator++){
goPositive ? xPos++ : xPos--;
//push new coordinates
resultArray.push([xPos,yPos])
}
//iterate vertically up or down
for (let yIterator = 0; yIterator < thisLength; yIterator++){
goPositive ? yPos++ : yPos--;
//push new coordinates
resultArray.push([xPos,yPos])
}
}
return resultArray;
}
Another Solution
function tropicalSpiral(n) {
let x = 0,
y = 0,
result = [[0, 0]],
z = n * -1,
k = 1;
while (x !== z && y !== z) {
// increment x positive
for (let i = 0; i < k; i++) result.push([++x, y]);
// increment y positive
for (let j = 0; j < k; j++) result.push([x, ++y]);
// increment our 'k' threshold
k++;
// decrement x negative
for (let i = 0; i < k; i++) result.push([--x, y]);
// decrement y negative
for (let j = 0; j < k; j++) result.push([x, --y]);
}
return result;
}
tropicalSpiral(1);
Copy of Copy of Spiral Jetty
By Tom Kelly
Copy of Copy of Spiral Jetty
Technical interview problem on Robert Smithson
- 1,390