Advertisement
Guest User

Euler 14 elixir

a guest
Apr 8th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.30 KB | None | 0 0
  1. defmodule Euler14 do
  2.  
  3. def start do
  4. spawn(fn ->
  5. loop({0, 0, 0})
  6. end)
  7. end
  8.  
  9. def get_longest_seq(start_num, server_pid) do
  10. send(server_pid, {:run_seq, self, start_num})
  11. end
  12.  
  13. def get_result() do
  14. receive do
  15. {:seq_result, seq} -> seq
  16. after 5000 -> {:error, :timeout}
  17. end
  18. end
  19.  
  20. defp loop({max_num, num_len, counter}) do
  21. new_max = max_num
  22. new_len = num_len
  23. receive do
  24. {:run_seq, caller, start_num} ->
  25. seq = next_num_in_seq(start_num)
  26. seq_length = length(seq)
  27. if seq_length > new_len do
  28. new_len = seq_length
  29. new_max = start_num
  30. end
  31. counter = counter + 1
  32.  
  33. if counter >= 999999 do
  34. send(caller, {:seq_result, new_max})
  35. end
  36. #send(caller, {:seq_result, new_max})
  37. end
  38.  
  39. loop({new_max, new_len, counter})
  40. end
  41.  
  42. defp next_num_in_seq(_, list = [1 | _]), do: list
  43. defp next_num_in_seq(:even, list = [n | _]) do
  44. new_n = div(n, 2)
  45. next_num_in_seq(get_parity(new_n), [new_n | list])
  46. end
  47. defp next_num_in_seq(:odd, list = [n | _]) do
  48. new_n = (n * 3) + 1
  49. next_num_in_seq(get_parity(new_n), [new_n | list])
  50. end
  51. defp next_num_in_seq(n), do: next_num_in_seq(get_parity(n), [n])
  52.  
  53. defp get_parity(n) do
  54. import Integer
  55. case Integer.is_even(n) do
  56. true -> :even
  57. false -> :odd
  58. end
  59. end
  60. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement