Created
June 8, 2016 04:06
-
-
Save terakilobyte/6eec8e7dd2e72bbf653a01d81d622420 to your computer and use it in GitHub Desktop.
This file contains hidden or 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 Luhn do | |
@spec is_luhn?(number()) :: boolean() | |
def is_luhn?(number) do | |
number |> | |
Integer.digits |> | |
Enum.reverse |> | |
sort_and_sum_numbers |> | |
verify? | |
end | |
defp sort_and_sum_numbers(number_list) do | |
odds = | |
Enum.take_every(number_list, 2) |> | |
Enum.sum | |
evens = | |
Enum.take_every(tl(number_list), 2) |> | |
Enum.reduce(0, fn(x, acc) -> luhn_reduction_over_9(x) + acc end) | |
evens + odds | |
end | |
defp luhn_reduction_over_9(number) do | |
number = number * 2 | |
cond do | |
number > 9 -> | |
1 + rem(number, 10) | |
true -> | |
number | |
end | |
end | |
defp verify?(number), do: rem(number, 10) == 0 | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment