Skip to content

Instantly share code, notes, and snippets.

@terakilobyte
Created June 8, 2016 04:06
Show Gist options
  • Save terakilobyte/6eec8e7dd2e72bbf653a01d81d622420 to your computer and use it in GitHub Desktop.
Save terakilobyte/6eec8e7dd2e72bbf653a01d81d622420 to your computer and use it in GitHub Desktop.
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