]>
| Commit | Line | Data |
|---|---|---|
| bbe64407 JK |
1 | import qualified Data.Map.Strict as M |
| 2 | import Text.ParserCombinators.ReadP | |
| 3 | import Control.Applicative ((<|>)) | |
| 4 | ||
| 5 | main :: IO () | |
| 6 | main = do | |
| 7 | shifts <- map parse . lines <$> getContents | |
| 8 | print "a" | |
| 9 | ||
| 10 | type GID = Int | |
| 11 | ||
| 12 | data Status = Begin | Awake | Asleep deriving (Show) | |
| 13 | data Date = Date Int Int Int deriving (Show) | |
| 14 | data Time = Time Int Int deriving (Show) | |
| 15 | ||
| 16 | data Shift = Shift Status GID Date Time deriving (Show) | |
| 17 | ||
| 18 | parse :: String -> Shift | |
| 19 | parse = fst . head . readP_to_S go | |
| 20 | where digit :: ReadP Char | |
| 21 | digit = satisfy (\char -> char >= '0' && char <= '9') | |
| 22 | stGet :: String -> Status | |
| 23 | stGet "wakes up" = Awake | |
| 24 | stGet "falls asleep" = Asleep | |
| 25 | stGet "Guard #" = Begin | |
| 26 | go :: ReadP Shift | |
| 27 | go = do | |
| 28 | char '[' | |
| 29 | year <- read <$> count 4 digit | |
| 30 | char '-' | |
| 31 | month <- read <$> count 2 digit | |
| 32 | char '-' | |
| 33 | day <- read <$> count 2 digit | |
| 34 | char ' ' | |
| 35 | hour <- read <$> count 2 digit | |
| 36 | char ':' | |
| 37 | minute <- read <$> count 2 digit | |
| 38 | string "] " | |
| 39 | rt <- string "Guard #" <|> string "wakes up" <|> string "falls asleep" | |
| 40 | gid <- option (-1) (read <$> many1 digit) | |
| 41 | optional $ string " begins shift" | |
| 42 | eof | |
| 43 | let d = Date year month day | |
| 44 | let t = Time hour minute | |
| 45 | return (Shift (stGet rt) gid d t) |