Skip to content

Instantly share code, notes, and snippets.

@ignacy
Created May 24, 2015 16:30
Show Gist options
  • Select an option

  • Save ignacy/ee93c74443779ead5c1e to your computer and use it in GitHub Desktop.

Select an option

Save ignacy/ee93c74443779ead5c1e to your computer and use it in GitHub Desktop.
Validate CC checksum
{-
Validate CC's checksum
-}
module HW01 where
lastDigit :: Integer -> Integer
lastDigit x = x `mod` 10
dropLastDigit :: Integer -> Integer
dropLastDigit x = x `div` 10
toDigitsReversed :: Integer -> [Integer]
toDigitsReversed n
| n <= 0 = []
| otherwise = lastDigit n : toDigitsReversed (dropLastDigit n)
toDigits :: Integer -> [Integer]
toDigits n = reverse (toDigitsReversed n)
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther xs = reverse (doubleOnReversed (reverse xs))
doubleOnReversed :: [Integer] -> [Integer]
doubleOnReversed [] = []
doubleOnReversed (x:[]) = [x]
doubleOnReversed (x:(y:zs)) = x : (2 * y) : doubleOnReversed zs
sumDigits :: [Integer] -> Integer
sumDigits [] = 0
sumDigits (x:xs) = (sum (toDigits x)) + sumDigits xs
validate :: Integer -> Bool
validate n = ((sumDigits (doubleEveryOther (toDigits n))) `mod` 10) == 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment