-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDay8.hs
46 lines (37 loc) · 1.43 KB
/
Day8.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{-# LANGUAGE TemplateHaskell #-}
module Day8
( part1
, part2
) where
import Data.ByteString (ByteString)
import Data.Void
import FlatParse.Basic (anyAsciiChar, char, eof, runParser,
switch, (<|>))
import Helpers.Parsers.FlatParse (extract)
import qualified Helpers.Parsers.FlatParse as F (Parser)
type Parser = F.Parser Int
parseInput :: Parser -> Parser
parseInput parser = parseLine parser <|> (eof >> return 0)
parseLine :: Parser -> Parser
parseLine parser = parser <|> ($(char '\n') >> parseInput parser)
parseChar :: Parser
parseChar =
$(switch
[|case _ of
"\"" -> (+ 1) <$> parseLine parseChar
"\\x" -> anyAsciiChar >> anyAsciiChar >> (+ 3) <$> parseLine parseChar
"\\" -> anyAsciiChar >> (+ 1) <$> parseLine parseChar
_ -> anyAsciiChar >> parseLine parseChar|])
parseChar' :: Parser
parseChar' =
$(switch
[|case _ of
"\"" -> (+ 2) <$> parseLine parseChar'
"\\x" ->
anyAsciiChar >> anyAsciiChar >> (+ 1) <$> parseLine parseChar'
"\\" -> anyAsciiChar >> (+ 2) <$> parseLine parseChar'
_ -> anyAsciiChar >> parseLine parseChar'|])
part1 :: Bool -> ByteString -> String
part1 _ = show . extract . runParser (parseInput parseChar)
part2 :: Bool -> ByteString -> String
part2 _ = show . extract . runParser (parseInput parseChar')