ICPC: Problem A Keitai Message

みんなやってて楽しそうだったからやりました。Parsecでやっつ系。

import Text.ParserCombinators.Parsec as Parsec

key = [cycle ['.',',','!','?',' '],
       cycle ['a','b','c'],
       cycle ['d','e','f'],
       cycle ['g','h','i'],
       cycle ['j','k','l'],
       cycle ['m','n','o'],
       cycle ['p','q','r','s'],
       cycle ['t','u','v'],
       cycle ['w','x','y','z']]

parse str = case Parsec.parse keitaiParser "keitai" str of
                Left err -> error $ show err
                Right xs -> map ((\(x,y) -> (key !! (read [x] - 1)) !! (y - 1)) . (\x -> (head x, length x))) $ filter ("" /=) xs

keitaiParser = do
        optional $ skipMany1 $ many1 $ char '0'
        s  <- many1 (noneOf "0") >>= \x -> (many1 (char '0') >> return x) <|> (return "")
        ss <- keitaiParser <|> return []
        return $ s:ss