30 lines
999 B
Text
30 lines
999 B
Text
defmodule RC do
|
|
def spiral_matrix(n) do
|
|
wide = String.length(to_string(n*n-1))
|
|
fmt = String.duplicate("~#{wide}w ", n) <> "~n"
|
|
right(n,n-1,0,[]) |> Enum.reverse |> Enum.with_index |> Enum.sort |> Enum.chunk(n) |>
|
|
Enum.each(fn row ->
|
|
:io.format fmt, (for {_,i} <- row, do: i)
|
|
end)
|
|
end
|
|
|
|
def right(n, side, i, coordinates) do
|
|
down(n, side, i, Enum.reduce(0..side, coordinates, fn j,acc -> [{i, i+j} | acc] end))
|
|
end
|
|
|
|
def down(_, 0, _, coordinates), do: coordinates
|
|
def down(n, side, i, coordinates) do
|
|
left(n, side-1, i, Enum.reduce(1..side, coordinates, fn j,acc -> [{i+j, n-1-i} | acc] end))
|
|
end
|
|
|
|
def left(n, side, i, coordinates) do
|
|
up(n, side, i, Enum.reduce(side..0, coordinates, fn j,acc -> [{n-1-i, i+j} | acc] end))
|
|
end
|
|
|
|
def up(_, 0, _, coordinates), do: coordinates
|
|
def up(n, side, i, coordinates) do
|
|
right(n, side-1, i+1, Enum.reduce(side..1, coordinates, fn j,acc -> [{i+j, i} | acc] end))
|
|
end
|
|
end
|
|
|
|
RC.spiral_matrix(5)
|