Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.76 KB | None | 0 0
  1. basic_data = [ ["A", "B", "C", "D"],
  2. ["E", "F", "G", "H"],
  3. ["I", "J", "K", "L"] ]
  4.  
  5. defmodule Spiralizer do
  6.  
  7. def spiralize(full_array) do
  8. cursor = %{x: 0, y: 0}
  9. matrix = Matrix.create_matrix(full_array)
  10. max_y = length full_array
  11. max_x = List.first(full_array) |> length
  12. step(cursor, matrix, max_x, max_y)
  13. end
  14.  
  15. defp step(cursor, matrix, max_x, max_y, acc \\ "") do
  16. element = Matrix.at(cursor)
  17. if length(matrix) == 0 do
  18. acc
  19. else
  20. case cursor do
  21. %{x: 0, y: ^max_y } ->
  22. step(%{x: 0, y: max_y - 1 }, List.delete(matrix, element), max_x, max_y, "#{acc} #{element.value}")
  23. %{x: ^max_x, y: y } ->
  24. step(%{x: max_x, y: y + 1 }, List.delete(matrix, element), max_x, max_y, "#{acc} #{element.value}")
  25. %{x: x, y: ^max_y } ->
  26. step(%{x: x - 1, y: max_y }, List.delete(matrix, element), max_x, max_y, "#{acc} #{element.value}")
  27. %{x: x, y: y} when x < max_x and y < max_y ->
  28. step(%{x: x + 1, y: y }, List.delete(matrix, element), max_x, max_y, "#{acc} #{element.value}")
  29. end
  30. end
  31. end
  32. end
  33.  
  34. defmodule Matrix do
  35.  
  36. defmodule Element do
  37. defstruct position: %{ x: 0, y: 0 }, value: ""
  38. end
  39.  
  40. def create_matrix(arr_of_arr) do
  41. arr_of_arr |>
  42. Enum.with_index |>
  43. Enum.map(fn{arr, index_y} ->
  44. arr |>
  45. Enum.with_index |>
  46. Enum.map(fn{value, index_x} ->
  47. %Element{position: %{x: index_x, y: index_y }, value: value}
  48. end)
  49. end) |>
  50. List.flatten
  51. end
  52.  
  53. def at(matrix, cursor) do
  54. Enum.find(matrix, fn(elem) ->
  55. elem.position == cursor
  56. end)
  57. end
  58. end
  59.  
  60. matrix = Matrix.create_matrix(basic_data)
  61. IO.inspect matrix
  62. IO.inspect Matrix.at(matrix, %{x: 2, y: 1})
  63. IO.inspect Spiralizer.spiralize(basic_data)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement