3 ms·
A Haskell solution, though I'm sure someone can do better ;) Perhaps I'll clean it up using printf/format[0] later. {-# LANGUAGE OverloadedStrings #-}
by codygman 12y ago
A Haskell solution, though I'm sure someone can do better ;)
Perhaps I'll clean it up using printf/format[0] later.
{-# LANGUAGE OverloadedStrings #-}
import Control.Monad (liftM)
import qualified Data.HashMap.Lazy as H
import Data.List (sort)
import Data.Maybe (fromMaybe)
import Data.Monoid ((<>))
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import Prelude
main :: IO ()
main = do
gradesMap <- liftM
(H.fromList . map ((\(x:y:_) -> (x,y)) . T.splitOn "\t") . T.lines)
(TIO.readFile "example.txt")
let failingNames = H.keys $ H.filter ((== F) . T.take 1) gradesMap
gradeTotals = foldl
(\m k -> H.insertWith (+) (T.take 1 k) 1 m)
H.empty
(H.elems gradesMap)
TIO.putStrLn $ "Zsófia's grades: " <>
fromMaybe "N/A" (H.lookup "Zsófia" gradesMap)
TIO.putStrLn "List of students with a failing grade:"
TIO.putStrLn $ " " <> T.intercalate ", " failingNames
TIO.putStrLn "Distribution of grades by letter:"
mapM_ (\(k,v) -> TIO.putStrLn $ " " <> k <> ": " <> (T.pack . show $ v) <> " students")
(sort . H.toList $ gradeTotals)
0: http://hackage.haskell.org/package/formatting http://hackage.haskell.org/package/formatting