Skip to content

Commit 1ac2cd2

Browse files
author
Peter Mueller
committed
refactor into luhn function
1 parent 4ffb388 commit 1ac2cd2

2 files changed

Lines changed: 23 additions & 17 deletions

File tree

lib/ex_junk.ex

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,8 @@ defmodule Junk do
4242
base_digits = junk(Integer, opts)
4343
|> Integer.digits
4444
|> (fn digits -> [8,0,8,4,0] ++ [Enum.random(1..2)] ++ digits end).()
45-
46-
# starting from the right, doubles digits
47-
# splits into 2 digits where needed
48-
# sums, and adds 24 (for the 80840 of the longer form npi)
49-
check_sum = base_digits
50-
|> Enum.reverse
51-
|> Junk.map_every(2, fn(n) ->Integer.digits(n*2) end)
52-
|> List.flatten
53-
|> Enum.sum
54-
55-
# calcs the check digit
56-
check_digit = case Kernel.rem(check_sum, 10) do
57-
0 -> 0
58-
n -> 10 - n
59-
end
60-
61-
(base_digits ++ [check_digit]) |> Integer.undigits
45+
|> Integer.undigits
46+
|> Junk.luhn
6247
end
6348

6449
def junk(:npi, opts) do
@@ -79,6 +64,23 @@ defmodule Junk do
7964
end
8065
end
8166

67+
def luhn(number) do
68+
base_digits = Integer.digits(number)
69+
check_sum = base_digits
70+
|> Enum.reverse
71+
|> Junk.map_every(2, fn(n) ->Integer.digits(n*2) end)
72+
|> List.flatten
73+
|> Enum.sum
74+
75+
# calcs the check digit
76+
check_digit = case Kernel.rem(check_sum, 10) do
77+
0 -> 0
78+
n -> 10 - n
79+
end
80+
81+
(base_digits ++ [check_digit]) |> Integer.undigits
82+
end
83+
8284
def map_every(enumerable, nth, mapper) do
8385
{res, _acc} = Enum.map_reduce(enumerable, 0, fn(x, i) -> if (rem(i, nth) == 0) do
8486
{mapper.(x), i+1}

test/ex_junk_test.exs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ defmodule JunkTest do
9999
assert Enum.member?([808401,808402], first_6)
100100
end
101101

102+
test "luhn returns a luhn'd number" do
103+
assert Junk.luhn(80840268496713) == 808402684967138
104+
end
105+
102106
def ssn do
103107
"123-45-6789"
104108
end

0 commit comments

Comments
 (0)