euler_ex/problems/solutions/23/solution.exs

38 lines
830 B
Elixir

defmodule AmicableNumbers do
def divisors(n) do
[ 1 |
(for i <- 2..floor(:math.sqrt(n))//1,
j = div(n, i),
j == n / i do
if i !== j, do: [i,j], else: [i]
end |> Enum.flat_map(&(&1))) ]
end
end
defmodule Abundance do
def is_abundant?(n) do
cache = Process.get(:abundance, %{})
case cache |> Map.get(n) do
nil ->
sum = AmicableNumbers.divisors(n) |> Enum.sum()
is? = sum > n
Process.put(:abundance, Map.put(cache, n, is?))
is?
is? -> is?
end
end
end
# sum of all numbers that can be expressed as sum of two abundant numbers
sum = for n <- 1..28123,
mid = div(n, 2),
Enum.any?(1..mid, &(Abundance.is_abundant?(&1) and Abundance.is_abundant?(n - &1))),
reduce: 0
do
s -> s + n
end
(((28123*28124)/2) - sum)
|> IO.puts()