# Traverse 2D Array in a spiral
# Set 4 variables to define the outer bounds
# of the matrix - left, right, top, bottom
# Set a direction: 0 -> left to right, 1 -> top to bottom,
# 2 -> right to left, 3 -> bottom to top
# At each iteration check which direction is set and
# iterate through those values in the matrix
# Then increment the outer bound by 1 to show
# that that area has already been traced

def traverse_spiral(matrix)
  l   = 0
  r   = matrix[0].length - 1
  b   = matrix.length - 1
  t   = 0
  dir = 0

  # loop until top bound equals bottom bounds and left bounds equals right
  while t <= b && l <= r

    if dir == 0
      (l..r).each { |left_index| puts matrix[t][left_index] }
      t += 1
    end

    if dir == 1
      (t..b).each { |top_col_ind| puts matrix[top_col_ind][r] }
      r -= 1
    end

    if dir == 2
      r.downto(l) { |right_index| puts matrix[b][right_index] }
      b -= 1
    end

    if dir == 3
      b.downto(t) { |bot_col_index| puts matrix[bot_col_index][l] }
      l += 1
    end

    dir = (dir + 1) % 4
  end
end
