Skip to content

Instantly share code, notes, and snippets.

@MarcusXavierr
Created July 21, 2022 01:10
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 MarcusXavierr/63bd89c8a77dae17f428c265ae1d39fa to your computer and use it in GitHub Desktop.
Save MarcusXavierr/63bd89c8a77dae17f428c265ae1d39fa to your computer and use it in GitHub Desktop.
CIS 194 week's 3 exercises
import Data.Map (fromListWith, toList)
import Data.List
-- Exercise 1 Hopscotch
skips :: [a] -> [[a]]
skips = reverse . drop 1 . reverse . tails
-- Exercise 2 Local Maxima
localMaxima :: [Integer] -> [Integer]
localMaxima xs = result
where
f = foldr (\x acc -> if length x >=3 then take 3 x : acc else acc ) [] ( skips xs )
result = foldr (\x acc -> if middle x > head x && middle x > last x then middle x : acc else acc) [] f
middle :: [Integer] -> Integer
middle (l:m:r) = m
middle _ = error "You need to pass a array with 3 values"
-- Exercise 3 Histogram
histogram :: [Integer] -> String
histogram xs = let
frequencyOfNumbers = frequency xs
rows = generateRows frequencyOfNumbers
in ( concat . reverse ) rows ++ base
generateRows :: [(Integer, Integer)] -> [String]
generateRows xs
|canContinue xs = createString xs : generateRows (removeRow xs)
|otherwise = []
createString :: [(Integer, Integer)] -> String
createString xs = foldr (\x acc -> if snd x > 0 then '*' : acc else ' ' : acc) [] xs ++ "\n"
frequency :: [Integer] -> [(Integer, Integer)]
frequency xs = toList $ fromListWith (+) $ [ (x,1) | x <- xs] ++ [ (x,0)| x <- [0..9]]
removeRow :: [(Integer, Integer)] -> [(Integer, Integer)]
removeRow = foldr (\x acc -> if snd x > 0 then (fst x, snd x - 1) : acc else x : acc ) []
canContinue :: [(Integer, Integer)] -> Bool
canContinue = foldl (\acc x -> ( snd x > 0 ) || acc) False
prependToBase :: [String] -> String
prependToBase = foldr (++) base
base :: String
base = "==========\n0123456789\n"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment