## DEV Community is a community of 601,094 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

# Discussion on: Snail Array Challenge Solution JavaScript

Matt Ellen

While I don't think I have an efficient way of generating the spiral, I learnt a thing or two.
My method is to rotate the grid by 90 degrees and take the top row from the grid and add it to the output.

(function(input)
{
input = input.flat();

function indexToXY(index, width)
{
let x = index % width;
let y = Math.floor(index / width);
return [x,y];
}

function xyToIndex(x, y, width)
{
return (x + (y * width));
}

function snail(grid, width, shrinkwidth)
{
if(grid.length == 0)
{
return [];
}
if(grid.length == 1)
{
return grid;
}
let part = grid.splice(0, width);
width = Math.ceil(Math.sqrt(grid.length));
grid = grid.reduce((oup, item, index) =>
{
let [x, y] = indexToXY(index, width);
let pole = Math.floor(width/2);
let polex = x - pole;
let poley = y - pole;
let r = Math.sqrt((polex*polex)+(poley*poley));
let fi = Math.atan2(poley, polex);
fi -= Math.PI/2;
let newx = Math.round((Math.cos(fi)*r)+pole);
let newy = Math.round((Math.sin(fi)*r)+pole);
let newIndex = xyToIndex(newx, newy, width);
oup[newIndex] = item;
return oup;
}, []).filter(x=>x);

if(shrinkwidth)
{
width--;
}

return part.concat(snail(grid, width, !shrinkwidth));
}

return snail(input, Math.ceil(Math.sqrt(input.length)), true);

})([[1,2,3,1], [4,5,6,4], [7,8,9,7], [7,8,9,7]])