JSFiddle - React, Tailwind, and code Playground

by SanjayVyas

JavaScript

//% Fill and odd size array with spiralling values
//# [Sanjay Vyas]
const spiral = (size) => {
  if (size < 3 || !(size % 2)) throw Error("Size must be odd number >= 3");

  const matrix = Array.from(Array(size), () => Array.from(Array(size), () => 0));
  let row = Math.floor(size / 2);
  let col = row;
  let direction = 0;
  let value = 1;

  while (value <= size * size) {
    do {
      matrix[row][col] = value++;
      row += [0, 1, 0, -1][direction];
      col += [1, 0, -1, 0][direction];
    } while (matrix[row + [1, 0, -1, 0][direction]][col + [0, -1, 0, +1][direction]]);

    direction = ++direction % 4;
  }

  let line;
  const maxWidth = (size * size).toString().length + 1;
  for (let r = 0; r < size; r++) {
    line = "";
    for (let c = 0; c < size; c++) {
      line += matrix[r][c].toString().padStart(maxWidth, ' ');
    }
    console.log(line);
  }
}

spiral(9);