finished luhn algorithm
This commit is contained in:
parent
e9f43a54fc
commit
a979f16ea1
32
luhn.lhs
32
luhn.lhs
@ -1,13 +1,43 @@
|
|||||||
This is an implementation of the Luhn Algorithm. It's used to validate credit card numbers.
|
This is an implementation of the Luhn Algorithm. It's used to validate
|
||||||
|
credit card numbers.
|
||||||
|
|
||||||
|
Return the last digit of an integer number
|
||||||
|
|
||||||
> lastDigit :: Integer -> Integer
|
> lastDigit :: Integer -> Integer
|
||||||
> lastDigit n = mod n 10
|
> lastDigit n = mod n 10
|
||||||
|
|
||||||
|
Remove the last digit of an integer number and return the rest
|
||||||
|
|
||||||
> dropLastDigit :: Integer -> Integer
|
> dropLastDigit :: Integer -> Integer
|
||||||
> dropLastDigit n = div n 10
|
> dropLastDigit n = div n 10
|
||||||
|
|
||||||
|
Put all digits of an integer number in reverse order into a list
|
||||||
|
|
||||||
> toRevDigits :: Integer -> [Integer]
|
> toRevDigits :: Integer -> [Integer]
|
||||||
> toRevDigits n
|
> toRevDigits n
|
||||||
> | n < 1 = []
|
> | n < 1 = []
|
||||||
> | otherwise = lastDigit(n) : toRevDigits(dropLastDigit(n))
|
> | otherwise = lastDigit(n) : toRevDigits(dropLastDigit(n))
|
||||||
|
|
||||||
|
Put all digits of an integer number into a list
|
||||||
|
|
||||||
|
> toDigits :: Integer -> [Integer]
|
||||||
|
> toDigits n = reverse(toRevDigits(n))
|
||||||
|
|
||||||
|
Double every second value in the input list.
|
||||||
|
|
||||||
|
> doubleEveryOther :: [Integer] -> [Integer]
|
||||||
|
> doubleEveryOther([]) = []
|
||||||
|
> doubleEveryOther(x:[]) = [x]
|
||||||
|
> doubleEveryOther(a:(b:xs)) = a : 2*b : doubleEveryOther(xs)
|
||||||
|
|
||||||
|
Sum up all digits from all integers.
|
||||||
|
|
||||||
|
> sumDigits :: [Integer] -> Integer
|
||||||
|
> sumDigits([]) = 0
|
||||||
|
> sumDigits(0:xs) = sumDigits(xs)
|
||||||
|
> sumDigits(x:xs) = lastDigit(x) + sumDigits(dropLastDigit(x) : xs)
|
||||||
|
|
||||||
|
Evaluate if a credit card number is 'valid'.
|
||||||
|
|
||||||
|
> luhn :: Integer -> Bool
|
||||||
|
> luhn x = lastDigit(sumDigits(doubleEveryOther(toRevDigits(x)))) == 0
|
||||||
|
Reference in New Issue
Block a user