fork download
  1. import Data.List
  2.  
  3. main = do
  4. let weight = 237
  5. putStrLn $ "Weight of coins: " ++ shows (weight / 10) " g"
  6. let coinsList = inferenceCoins weight
  7. putStrLn $ shows (length coinsList) " results"
  8. mapM (putStrLn . itemize) coinsList
  9.  
  10. itemize cs = shows (sum cs) $ " yen : " ++ (intercalate ", " . map f $ group cs)
  11. where
  12. f c = shows (length c) $ " [" ++ shows (head c) " yen coin]"
  13.  
  14. inferenceCoins = f coins
  15. where
  16. f _ w
  17. | w == 0 = [[]]
  18. | w < 0 = []
  19. f [] _ = []
  20. f cs@(c:cs') w = map (c:) (f cs $ w - coinWeight c) ++ f cs' w
  21.  
  22. coins = reverse [1, 5, 10, 50, 100, 500]
  23.  
  24. coinWeight 1 = 10
  25. coinWeight 5 = 37
  26. coinWeight 10 = 45
  27. coinWeight 50 = 40
  28. coinWeight 100 = 48
  29. coinWeight 500 = 70
Success #stdin #stdout 0s 4592KB
stdin
Standard input is empty
stdout
Weight of coins: 23.7 g
23 results
1057 yen : 2 [500 yen coin], 1 [50 yen coin], 1 [5 yen coin], 2 [1 yen coin]
1011 yen : 2 [500 yen coin], 1 [5 yen coin], 6 [1 yen coin]
620 yen : 1 [500 yen coin], 1 [100 yen coin], 1 [10 yen coin], 2 [5 yen coin]
656 yen : 1 [500 yen coin], 3 [50 yen coin], 1 [5 yen coin], 1 [1 yen coin]
610 yen : 1 [500 yen coin], 2 [50 yen coin], 1 [5 yen coin], 5 [1 yen coin]
575 yen : 1 [500 yen coin], 1 [50 yen coin], 2 [10 yen coin], 1 [5 yen coin]
564 yen : 1 [500 yen coin], 1 [50 yen coin], 1 [5 yen coin], 9 [1 yen coin]
529 yen : 1 [500 yen coin], 2 [10 yen coin], 1 [5 yen coin], 4 [1 yen coin]
518 yen : 1 [500 yen coin], 1 [5 yen coin], 13 [1 yen coin]
410 yen : 4 [100 yen coin], 1 [10 yen coin]
218 yen : 2 [100 yen coin], 3 [5 yen coin], 3 [1 yen coin]
173 yen : 1 [100 yen coin], 1 [50 yen coin], 1 [10 yen coin], 2 [5 yen coin], 3 [1 yen coin]
127 yen : 1 [100 yen coin], 1 [10 yen coin], 2 [5 yen coin], 7 [1 yen coin]
255 yen : 5 [50 yen coin], 1 [5 yen coin]
209 yen : 4 [50 yen coin], 1 [5 yen coin], 4 [1 yen coin]
163 yen : 3 [50 yen coin], 1 [5 yen coin], 8 [1 yen coin]
128 yen : 2 [50 yen coin], 2 [10 yen coin], 1 [5 yen coin], 3 [1 yen coin]
117 yen : 2 [50 yen coin], 1 [5 yen coin], 12 [1 yen coin]
82 yen : 1 [50 yen coin], 2 [10 yen coin], 1 [5 yen coin], 7 [1 yen coin]
71 yen : 1 [50 yen coin], 1 [5 yen coin], 16 [1 yen coin]
47 yen : 4 [10 yen coin], 1 [5 yen coin], 2 [1 yen coin]
36 yen : 2 [10 yen coin], 1 [5 yen coin], 11 [1 yen coin]
25 yen : 1 [5 yen coin], 20 [1 yen coin]