From a979f16ea11f0c1f7f4e6ce24ee5dc545d927999 Mon Sep 17 00:00:00 2001 From: Michael Mandl Date: Fri, 25 Mar 2016 21:11:23 +0100 Subject: [PATCH] finished luhn algorithm --- luhn.lhs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/luhn.lhs b/luhn.lhs index 6096209..fb5901d 100644 --- a/luhn.lhs +++ b/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 n = mod n 10 +Remove the last digit of an integer number and return the rest + > dropLastDigit :: Integer -> Integer > dropLastDigit n = div n 10 +Put all digits of an integer number in reverse order into a list + > toRevDigits :: Integer -> [Integer] > toRevDigits n > | n < 1 = [] > | 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