Skip to content

Instantly share code, notes, and snippets.

@jacobh
Created August 4, 2014 07:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jacobh/a307b71cd15b57ee6cba to your computer and use it in GitHub Desktop.
Save jacobh/a307b71cd15b57ee6cba to your computer and use it in GitHub Desktop.
toDigitsRev :: Integer -> [Integer]
toDigitsRev x
| x <= 0 = []
| otherwise = (x `mod` 10) : (toDigitsRev (x `div` 10))
toDigits :: Integer -> [Integer]
toDigits x = reverse (toDigitsRev x)
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther [] = []
doubleEveryOther [x] = [x]
doubleEveryOther (x:y:xs) = x : y * 2 : doubleEveryOther xs
splitDigits :: Integer -> [Integer]
splitDigits x
| x < 10 = [x]
| otherwise = (x `mod` 10) : (splitDigits (x `div` 10))
sumDigits :: [Integer] -> Integer
sumDigits [] = 0
sumDigits (x:xs) = (sum (splitDigits x)) + (sumDigits xs)
validate :: Integer -> Bool
validate x = (sumDigits (doubleEveryOther (toDigitsRev x))) `mod` 10 == 0
main = do
print (validate 4012888888881881) -- True
print (validate 4012888888881882) -- False
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment