ファイルを行数別に分類してカウントしてみる
30分プログラム、その636。ファイルを行数別に分類してカウントしてみる。
コードを書いてると、基本的に各ファイルの行数はばらばらになります。
というわけで、実際に、どれくらいばらけてるかを調べるために、行数ごとに分類してカウントするプログラムを書いてみました。
使い方
$ wcs *(.) 0-10: 23 10-50: 119 50-100: 15 100-: 158
ソースコード
import System import Control.Arrow countLine :: FilePath -> IO Int countLine path = do content <- readFile path return $ length $ lines content countFor :: Arrow a => (b -> Bool) -> b -> a Int Int countFor p x = arr $ \n -> if p x then n + 1 else n between a b n = if a <= n && n < b then True else False statics x = countFor (< 10) x *** countFor (10 `between` 50) x *** countFor (50 `between` 100) x *** countFor (100>=) x wcs paths = do xs <- mapM countLine paths return $ foldl (flip statics) (0,(0,(0,0))) xs main = do args <- getArgs (a,(b,(c,d))) <- wcs args putStrLn $ "0-10: " ++ show a putStrLn $ "10-50: " ++ show b putStrLn $ "50-100: " ++ show c putStrLn $ "100-: " ++ show d