Skip to content

Instantly share code, notes, and snippets.

@gcmurphy
Last active August 29, 2015 14:06
Show Gist options
  • Save gcmurphy/7635cb8ce52415365c08 to your computer and use it in GitHub Desktop.
Save gcmurphy/7635cb8ce52415365c08 to your computer and use it in GitHub Desktop.
CS194 Homework 1 - Credit card verification
-- http://www.seas.upenn.edu/~cis194/hw/01-intro.pdf
module Main where
-- | Return the last digit of an integer
--
-- >>> lastDigit 123
-- 3
--
-- >>> lastDigit 0
-- 0
lastDigit :: Integer -> Integer
lastDigit x = x `mod` 10
-- | Return everything but the last digit of an integer
--
-- >>> dropLastDigit 123
-- 12
--
-- >>> dropLastDigit 5
-- 0
dropLastDigit :: Integer -> Integer
dropLastDigit x = x `div` 10
-- | Split a number into a list of individual digits
--
-- >>> toDigits 1234
-- [1,2,3,4]
--
-- >>> toDigits 0
-- []
--
-- >>> toDigits (-17)
-- []
toDigits :: Integer -> [Integer]
toDigits n
| n <= 0 = []
| otherwise = toDigits (dropLastDigit n) ++ [lastDigit n]
--
-- Doubles every second item in a list
--
doubleHelper :: [Integer] -> [Integer]
doubleHelper [] = []
doubleHelper [x] = [x]
doubleHelper (x:y:xs) = x : (y * 2) : doubleHelper(xs)
-- | Double every second item in a list starting at the end
--
-- >>> doubleEveryOther [8, 7, 6, 5]
-- [16,7,12,5]
--
-- >>> doubleEveryOther [1, 2, 3]
-- [1,4,3]
--
doubleEveryOther :: [Integer] -> [Integer]
doubleEveryOther [] = []
doubleEveryOther xs = reverse $ doubleHelper $ reverse xs
-- | Calculate the sum of all the digits
--
-- >>> sumDigits [16, 7, 12, 5]
-- 22
--
sumDigits :: [Integer] -> Integer
sumDigits [] = 0
sumDigits (x:xs) = (sum (toDigits x)) + (sumDigits xs)
-- | Validate a credit card number
--
-- >>> validate 4012888888881881
-- True
--
-- >>> validate 4012888888881882
-- False
--
validate :: Integer -> Bool
validate n = total `mod` 10 == 0
where total = sumDigits $ doubleEveryOther $ toDigits n
main :: IO()
main = do
putStrLn "Enter Credit Card number: "
cc <- getLine
print $ validate $ read cc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment