19 lines
685 B
Text
19 lines
685 B
Text
defmodule RC do
|
|
def spiral_matrix(n) do
|
|
wide = length(to_char_list(n*n-1))
|
|
fmt = String.duplicate("~#{wide}w ", n) <> "~n"
|
|
runs = Enum.flat_map(n..1, &[&1,&1]) |> tl
|
|
delta = Stream.cycle([{0,1},{1,0},{0,-1},{-1,0}])
|
|
running(Enum.zip(runs,delta),0,-1,[])
|
|
|> Enum.with_index |> Enum.sort |> Enum.chunk(n)
|
|
|> Enum.each(fn row -> :io.format fmt, (for {_,i} <- row, do: i) end)
|
|
end
|
|
|
|
defp running([{run,{dx,dy}}|rest], x, y, track) do
|
|
new_track = Enum.reduce(1..run, track, fn i,acc -> [{x+i*dx, y+i*dy} | acc] end)
|
|
running(rest, x+run*dx, y+run*dy, new_track)
|
|
end
|
|
defp running([],_,_,track), do: track |> Enum.reverse
|
|
end
|
|
|
|
RC.spiral_matrix(5)
|