Created
May 20, 2014 13:43
-
-
Save msysyamamoto/031c995be7ef5fb85478 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import Control.Applicative ((<$>)) | |
| import Data.List (intersperse, sort, sortBy) | |
| import Text.Parsec (char, digit, letter, many1, parse) | |
| --| 日付はIntとして持つ | |
| -- 1と10の位が日, 100と1000の位が月に相当する | |
| -- e.g., 1月 5日 -> 105 | |
| -- 12月30日 -> 1230 | |
| data Ticket = Ticket { tName :: String | |
| , tFrom :: Int | |
| , tTo :: Int | |
| } | |
| deriving (Show) | |
| main :: IO () | |
| main = do | |
| ts <- lines' <$> getContents | |
| let tickets = ticketgobble ts | |
| count = length tickets | |
| putStrLn . concat $ intersperse " " (show count:tickets) | |
| ticketgobble :: [String] -> [String] | |
| ticketgobble [] = [] | |
| ticketgobble input = sort . map tName $ gobble [] tickets | |
| where | |
| tickets = sortByTo $ parseTicket <$> input | |
| gobble :: [Ticket] -> [Ticket] -> [Ticket] | |
| gobble acc [] = acc | |
| gobble acc (t0@(Ticket _ _ to):ts) = gobble (t0:acc) ts' | |
| where | |
| ts' = filter (\(Ticket _ from _) -> to < from) ts | |
| sortByTo :: [Ticket] -> [Ticket] | |
| sortByTo = sortBy cmp | |
| where | |
| cmp (Ticket _ _ fa) (Ticket _ _ fb) = compare fa fb | |
| parseTicket :: String -> Ticket | |
| parseTicket str = case parse ticket "parse" str of | |
| Right tk -> tk | |
| Left er -> error $ show er | |
| where | |
| ticket = do | |
| name <- many1 letter | |
| char ' ' | |
| from <- date | |
| char '-' | |
| to <- date | |
| return $ Ticket name from to | |
| date = do | |
| mon <- num | |
| char '/' | |
| day <- num | |
| return $ mon * 100 + day | |
| num = read <$> many1 digit | |
| lines' :: String -> [String] | |
| lines' = lines . filter (/= '\r') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment