Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- defmodule Euler14 do
- def start do
- spawn(fn ->
- loop({0, 0, 0})
- end)
- end
- def get_longest_seq(start_num, server_pid) do
- send(server_pid, {:run_seq, self, start_num})
- end
- def get_result() do
- receive do
- {:seq_result, seq} -> seq
- after 5000 -> {:error, :timeout}
- end
- end
- defp loop({max_num, num_len, counter}) do
- new_max = max_num
- new_len = num_len
- receive do
- {:run_seq, caller, start_num} ->
- seq = next_num_in_seq(start_num)
- seq_length = length(seq)
- if seq_length > new_len do
- new_len = seq_length
- new_max = start_num
- end
- counter = counter + 1
- if counter >= 999999 do
- send(caller, {:seq_result, new_max})
- end
- #send(caller, {:seq_result, new_max})
- end
- loop({new_max, new_len, counter})
- end
- defp next_num_in_seq(_, list = [1 | _]), do: list
- defp next_num_in_seq(:even, list = [n | _]) do
- new_n = div(n, 2)
- next_num_in_seq(get_parity(new_n), [new_n | list])
- end
- defp next_num_in_seq(:odd, list = [n | _]) do
- new_n = (n * 3) + 1
- next_num_in_seq(get_parity(new_n), [new_n | list])
- end
- defp next_num_in_seq(n), do: next_num_in_seq(get_parity(n), [n])
- defp get_parity(n) do
- import Integer
- case Integer.is_even(n) do
- true -> :even
- false -> :odd
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement