Skip to content

Instantly share code, notes, and snippets.

@Awlexus
Created July 18, 2020 20:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Awlexus/86fe506881222a6dc3cac50324834775 to your computer and use it in GitHub Desktop.
Save Awlexus/86fe506881222a6dc3cac50324834775 to your computer and use it in GitHub Desktop.
Solution to slow for kata 54d496788776e49e6b00052f
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