주어진 수가 완전수(약수의 합이 자기 자신과 같은 경우)인지, 약수의 합이 자기 자신보다 큰지 작은지 확인하는 문제였다. 지난 문제에서는 모든 인수를 구해야 했는데 이번에는 중복 없는 약수만 하면 되어서 약식으로 구현했다.
defmodule PerfectNumbers do
@spec classify(number :: integer) :: {:ok, atom} | {:error, String.t()}
def classify(number) when is_integer(number) and number >= 1 do
factors(number)
|> Enum.sum()
|> case do
sum when sum == number -> {:ok, :perfect}
sum when sum > number -> {:ok, :abundant}
sum when sum < number -> {:ok, :deficient}
end
end
def classify(_number), do: {:error, "Classification is only possible for natural numbers."}
defp factors(number) do
1..(div(number, 2))//1
|> Enum.filter(fn d -> rem(number, d) == 0 end)
end
end
'호두나무 공방 > Exercism in Elixir' 카테고리의 다른 글
Allergies - Exercism in Elixir (0) | 2022.07.26 |
---|---|
Isogram - Exercism in Elixir (0) | 2022.07.25 |
Prime Factors - Exercism in Elixir (0) | 2022.07.21 |
Matching Brackets - Exercism in Elixir (0) | 2022.07.20 |
House - Exercism in Elixir (0) | 2022.07.19 |