Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- basic_data = [ ["A", "B", "C", "D"],
- ["E", "F", "G", "H"],
- ["I", "J", "K", "L"] ]
- defmodule Spiralizer do
- def spiralize(full_array) do
- cursor = %{x: 0, y: 0}
- matrix = Matrix.create_matrix(full_array)
- max_y = length full_array
- max_x = List.first(full_array) |> length
- step(cursor, matrix, max_x, max_y)
- end
- defp step(cursor, matrix, max_x, max_y, acc \\ "") do
- element = Matrix.at(cursor)
- if length(matrix) == 0 do
- acc
- else
- case cursor do
- %{x: 0, y: ^max_y } ->
- step(%{x: 0, y: max_y - 1 }, List.delete(matrix, element), max_x, max_y, "#{acc} #{element.value}")
- %{x: ^max_x, y: y } ->
- step(%{x: max_x, y: y + 1 }, List.delete(matrix, element), max_x, max_y, "#{acc} #{element.value}")
- %{x: x, y: ^max_y } ->
- step(%{x: x - 1, y: max_y }, List.delete(matrix, element), max_x, max_y, "#{acc} #{element.value}")
- %{x: x, y: y} when x < max_x and y < max_y ->
- step(%{x: x + 1, y: y }, List.delete(matrix, element), max_x, max_y, "#{acc} #{element.value}")
- end
- end
- end
- end
- defmodule Matrix do
- defmodule Element do
- defstruct position: %{ x: 0, y: 0 }, value: ""
- end
- def create_matrix(arr_of_arr) do
- arr_of_arr |>
- Enum.with_index |>
- Enum.map(fn{arr, index_y} ->
- arr |>
- Enum.with_index |>
- Enum.map(fn{value, index_x} ->
- %Element{position: %{x: index_x, y: index_y }, value: value}
- end)
- end) |>
- List.flatten
- end
- def at(matrix, cursor) do
- Enum.find(matrix, fn(elem) ->
- elem.position == cursor
- end)
- end
- end
- matrix = Matrix.create_matrix(basic_data)
- IO.inspect matrix
- IO.inspect Matrix.at(matrix, %{x: 2, y: 1})
- IO.inspect Spiralizer.spiralize(basic_data)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement