Last active
August 29, 2015 14:07
-
-
Save wavebeem/de848a4652e9916227db to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Data.List | |
data Coin = Coin Integer String | |
instance Show Coin where | |
show (Coin _ name) = name | |
currency = | |
[ Coin 25 "quarter" | |
, Coin 10 "dime" | |
, Coin 5 "nickel" | |
, Coin 1 "penny" | |
] | |
opt1 n = (remainder, reverse change) where | |
(remainder, change) = opt (n, []) currency | |
opt (n, coins) [] = (n, coins) | |
opt (n, coins) (c@(Coin v _):cs) = case divMod n v of | |
(0, _) -> opt (n, coins) cs | |
(a, b) -> opt (b, (a, c) : coins) cs | |
opt2 n = (remainder, reverse change) where | |
(remainder, change) = foldl' opt (n, []) currency | |
opt (n, coins) c@(Coin v _) = case divMod n v of | |
(0, _) -> (n, coins) | |
(a, b) -> (b, (a, c) : coins) | |
optimal = opt2 | |
main = do | |
let f (n, c) = "\t" ++ show n ++ "\t" ++ show c | |
let change = 57 | |
let (n, coins) = optimal change | |
let lines = map f coins | |
putStrLn ("The optimal change for " ++ show change ++ " is:\n") | |
putStrLn (intercalate "\n" lines) | |
putStrLn ("\n...with " ++ show n ++ " cents left over") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment