import qualified Data.ByteString.Lazy.Char8 as C import qualified Data.Map.Strict as M counter :: C.ByteString -> M.Map Char Int counter = C.foldr counter' M.empty where counter' x m | M.notMember x m = M.insert x 1 m | otherwise = M.adjust (+ 1) x m countTrees :: C.ByteString -> Int countTrees s = minimum [t, r, div e 2] where ctr = counter s t = M.findWithDefault 0 't' ctr r = M.findWithDefault 0 'r' ctr e = M.findWithDefault 0 'e' ctr main :: IO () main = print . countTrees =<< C.getContents