過去一時間で一番使ったコマンドは?(失敗)

30分プログラム、その531。過去一時間で一番使ったコマンドを数えてみよとして失敗した。
よく考えたら、過去一時間ってことは現在時刻から一時間を引かないといけなんだよね。先頭と同じ時刻のやつだけとってもダメなんだよね。

22:20 ls
22:40 git
23:00 echo # <- ここまでしか見ない
23:10 echo
23:15 ls
23:20 ls  # <- 今ここ

そういえば前も同じミスをした気がする。
明日、直そう。

使い方

$ history -E 1 | runghc freq-command.hs
history-all     20
history 7
ls      4
echo    2
code/croquis    1
google  1
man     1
runghc  1

ソースコード

import Data.List
split :: Eq a => a -> [a] -> [[a]]
split _ [] = []
split x xs = let (ys,zs) = break (==x) xs
             in if ys == [] then
                    split x $ dropWhile (==x) zs
                else
                    ys : split x (dropWhile (==x) zs)

-- "11342  20.2.2009 22:33  history -E 1"
parse line =
    case split ' ' line of
      _:_:time:cmd:_ ->
          let t:_ =  split ':' time
          in  (t,cmd)
      _ ->
          error "parse error"

parseInput = reverse.map parse

recent [] = []
recent ys@((t,_):_) =
    takeWhile (\(x,_) -> x == t) ys

countByCmd = sortBy (\a b -> compare (length b) (length a)).group.sort

format = unlines.map(\(xs@(x:_)) -> x ++ "\t" ++ (show $ length xs))

freqCommand = format.countByCmd.
              map snd.
              recent.
              parseInput.
              lines

main = interact freqCommand