Created
July 18, 2020 20:45
-
-
Save Awlexus/86fe506881222a6dc3cac50324834775 to your computer and use it in GitHub Desktop.
Solution to slow for kata 54d496788776e49e6b00052f
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Sumofdivided do | |
def sum_of_divided(lst) do | |
table = :ets.new(:results, [{:write_concurrency, true}, :public, :ordered_set]) | |
lst | |
|> Task.async_stream(&insert_divs(&1, table), timeout: :infinity, ordered: false) | |
|> Stream.run() | |
:ets.tab2list(table) | |
end | |
defp insert_divs(n, table) do | |
n | |
|> prime_factors(2, []) | |
|> Enum.each(fn prime -> | |
:ets.update_counter table, prime, {2, n}, {0, 0} | |
end) | |
end | |
defp prime_factors(1, _, acc), do: acc | |
defp prime_factors(-1, _, acc), do: acc | |
defp prime_factors(n, divi, acc) when rem(n, divi) == 0, do: prime_factors(divide_all(n, divi), divi + 1, [divi | acc]) | |
defp prime_factors(n, divi, acc), do: prime_factors(n, divi + 1, acc) | |
defp divide_all(n, m) when rem(n, m) == 0, do: divide_all(div(n, m), m) | |
defp divide_all(n, _), do: n | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment