or1ko's diary

日々を書きます

16

言語処理100本ノック 2015

16. ファイルをN分割する
自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

16.hs

import System.Environment
import Control.Monad

main = do
  args <- getArgs
  let num = (read :: String -> Int) $ head args
  let filename = args !! 1
  body <- getContents 
  let l = lines body
  let a = div (length l) num + mod (length l) num
  let b = splitAt' a l
  mapM_ (\x -> writeFile (filename ++ (show x) ++ ".txt") $ unlines (b !! (x - 1))) [1..num] 

splitAt' n xs 
  | length xs <= n = [xs]
  | otherwise = x :(splitAt' n y) 
    where
      (x, y) = splitAt n xs

結構、プログラムが長くて、読みにくくなってしまった。行をn個に分割する関数を定義したら、良かったかもしれない。