Skip to content

Instantly share code, notes, and snippets.

@msysyamamoto
Created May 20, 2014 13:43
Show Gist options
  • Select an option

  • Save msysyamamoto/031c995be7ef5fb85478 to your computer and use it in GitHub Desktop.

Select an option

Save msysyamamoto/031c995be7ef5fb85478 to your computer and use it in GitHub Desktop.
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