Guest User

Untitled

a guest
Jun 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.40 KB | None | 0 0
  1. defmodule Gumimaze do
  2. def read() do
  3. lines = "maze.txt" |> File.read!() |> String.trim() |> String.split("\n")
  4. for {line, y} <- Enum.with_index(lines), {c, x} <- Enum.with_index(String.to_charlist(line)), into: %{} do
  5. {{x, y}, c}
  6. end
  7. end
  8.  
  9. def solve3(maze) do
  10. {x, y} = elem(Enum.find(maze, fn {_, v} -> v == ?S end), 0)
  11.  
  12. solve3_supervisor(maze, x, y)
  13. |> Enum.max
  14. end
  15.  
  16. defp solve3_supervisor(maze,x,y) do
  17. _ = spawn(Gumimaze, :walk3, [self(), maze, x, y, %{}, 0])
  18. solve3_supervisor([])
  19. end
  20.  
  21. defp solve3_supervisor(score_list) do
  22. receive do
  23. {:ok, pt} ->
  24. solve3_supervisor([pt | score_list])
  25. {:error, _ } ->
  26. solve3_supervisor(score_list)
  27. after 100 ->
  28. score_list
  29. end
  30. end
  31.  
  32. def walk3(parent_id, maze, x, y, walked, pt) do
  33. walked = Map.put(walked, {x, y}, true)
  34. for {x2, y2} <- [{x + 1, y}, {x, y + 1}, {x - 1, y}, {x, y - 1}] do
  35. case {walked[{x2, y2}], maze[{x2, y2}]} do
  36. {true, _} -> send(parent_id, {:error, :walked})
  37. {_, ?W} -> send(parent_id, {:error, :wall})
  38. {_, ?\s} -> spawn(Gumimaze, :walk3, [parent_id, maze, x2, y2, walked, pt])
  39. {_, ?1} -> spawn(Gumimaze, :walk3, [parent_id, maze, x2, y2, walked, pt + 1])
  40. {_, ?G} -> send(parent_id, {:ok, pt})
  41. end
  42. end
  43. end
  44.  
  45.  
  46. def main() do
  47. Gumimaze.read() |> Gumimaze.solve3() |> IO.puts
  48. end
  49. end
Add Comment
Please, Sign In to add comment