Guest User

Untitled

a guest
Nov 19th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. defmodule Test do
  2. def calc(matrix) do
  3. pairs = matrix
  4. |> String.codepoints()
  5. |> Enum.with_index()
  6. |> Enum.filter(fn({x, _y}) -> x != "0" end)
  7. |> Enum.map(fn({x, y}) -> {String.to_integer(x), y} end)
  8.  
  9. [ %{matrix: pairs, path: [], state: matrix} ]
  10. end
  11.  
  12. def pre(stack) do
  13. [first|stack] = stack
  14.  
  15. f = fn
  16. x, y when String.length(item[:state]) == 0 -> y ++ x
  17. x, y -> [x|y]
  18. end
  19.  
  20. run(first)
  21. |> Enum.reduce(stack, fn(item , st) -> f.(item, st) end )
  22.  
  23. end
  24.  
  25. def run(pairs) do
  26. hor = pairs[:matrix]
  27. |> Enum.map(fn({x,y}) -> [{x,y} , next_step(pairs[:matrix], y, 1)] end)
  28.  
  29. ver = pairs[:matrix]
  30. |> Enum.map(fn({x,y}) -> [{x,y} , next_step(pairs[:matrix], y , 4)] end)
  31.  
  32. hor ++ ver
  33. |> Enum.filter( fn([_p , p2]) -> p2 != nil end )
  34. |> Enum.filter( fn([{x, _y},{x2, _y2}]) -> x == x2 || x + x2 == 10 end)
  35. |> Enum.map( fn(pair) -> update_matrix(pairs, pair) end)
  36. end
  37.  
  38. def next_step(list , current , step ) do
  39. Enum.find(list , fn({_x1 , y1}) -> y1 - current > 0 && rem((y1 - current) , step) == 0 end)
  40. end
  41.  
  42. def update_matrix(matrix , [p , p2]) do
  43. filtered = matrix[:matrix]
  44. |> Enum.filter( fn(item) -> item != p && item != p2 end )
  45.  
  46. %{
  47. matrix: filtered,
  48. state: state(filtered),
  49. path: matrix[:path] ++ [[p,p2]]
  50. }
  51. end
  52.  
  53. def state(matrix) do
  54. Enum.reduce(matrix, "", fn({x,y}, acc) -> acc <> String.duplicate("0", y - String.length(acc)) <> Integer.to_string(x) end)
  55. end
  56.  
  57. def normalize(state) do
  58. Enum.map(state, fn(item) -> %{
  59. state: item[:state],
  60. path: Enum.map(item[:path] , fn([{_x, y}, {_x1, y1}]) -> {y, y1} end)
  61. } end)
  62. end
  63. end
  64.  
  65. pairs = "820569954037"
  66. |> Test.calc()
  67. |> Test.pre()
  68. |> Test.pre()
  69. |> Test.pre()
  70. |> Test.pre()
  71. |> Test.pre()
  72.  
  73. IO.inspect Test.normalize(pairs)
Add Comment
Please, Sign In to add comment