]>
Commit | Line | Data |
---|---|---|
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) |