]> git.rkrishnan.org Git - yorgey.git/blob - hw3/Golf.hs
histogram -- naive implementation
[yorgey.git] / hw3 / Golf.hs
1 module Golf where
2
3 import qualified Data.Map as M
4 import qualified Data.List as L
5
6 -- exercise 1
7 skips :: [a] -> [[a]]
8 skips xs = [map snd $ filter (\(i, _) -> (i `mod` n) == 0) $ zip [1..] xs | n <- [1 .. length xs]]
9
10 localMaxima :: [Integer] -> [Integer]
11 -- localMaxima xs = [p <- zip [0..length xs] xs], n <- [1 .. (length xs - 1)], fst p
12 localMaxima [] = []
13 localMaxima [_] = []
14 localMaxima [_,_] = []
15 localMaxima [x,y,z] | y > x && y > z = [y]
16                     | otherwise = []
17 localMaxima (x:y:z:xs) = localMaxima [x,y,z] ++ localMaxima (y:z:xs)
18
19 localMaxima' :: [Integer] -> [Integer]
20 localMaxima' xs = [b | [a,b,c] <- [drop (snd pair) (fst pair) | pair <- zip [[ p | p <- fst (splitAt n xs)] | n <- [3..length xs]] [0..]], b > a && b > c]
21
22 frequency :: [Integer] -> [(Integer, Integer)]
23 frequency xs = M.toList $ M.fromListWith (+) ([(c,1) | c <- xs] ++
24                                               [(c,0) | c <- [0..9]])
25 numStars :: Integer -> String
26 numStars n = take (fromInteger n) (repeat '*')
27
28 numSpaces :: Integer -> String
29 numSpaces n = take (fromInteger n) (repeat ' ')
30
31 histogram' xs = let freqs = [b | (_,b) <- frequency xs]
32                     m = maximum freqs
33                 in
34                   reverse $ L.transpose $ [take (fromInteger m) (numStars b ++ numSpaces (10 - b)) | b <- freqs]
35
36 histogram :: [Integer] -> String
37 histogram xs = (L.concat $ L.intersperse "\n" $ histogram' xs) ++ "\n"
38                ++ replicate 10 '=' ++ "\n" ++ (L.concat $ map show [0..9]) ++ "\n"