A bit of tidying, a bit of investigation
authorNeil Smith <neil.git@njae.me.uk>
Tue, 29 Dec 2020 14:30:30 +0000 (14:30 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Tue, 29 Dec 2020 15:19:41 +0000 (15:19 +0000)
advent19/src/advent19.hs
advent19/src/advent19atto.hs
advent19/src/advent19mega.hs

index 01e872d01e998c41ec3778ff031b6e3236ba2e06..a1fd6ccd8b34d3a4211750fa2d2f5010d6882795 100644 (file)
@@ -12,9 +12,7 @@ import Data.Either
 
 
 data Rule = Letter Char 
-          -- | Then2 Rule Rule
-          -- | Then3 Rule Rule Rule
-          | Then [Rule]
+           | Then [Rule]
           | Or Rule Rule
           | See Int
           deriving (Show, Eq)
@@ -29,7 +27,6 @@ main =
       let (rules, messages) = parse inputP text
       print $ part1 rules messages
       print $ part2 rules messages
-      -- print $ part2 text
 
 setup fname = 
   do text <- readFile fname
@@ -66,6 +63,7 @@ makeParser m (See i) = makeParser m (m!i)
 
 
 -- Parse the input
+inputP = (,) <$> rulesP <* blankLines <*> messagesP
 
 rulesP = M.fromList <$> ruleP `sepBy` endOfLine
 ruleP = (,) <$> decimal <* (string ": ") <*> ruleBodyP
@@ -76,9 +74,6 @@ orRuleP = Or <$> thenRuleP <* (string " | ") <*> thenRuleP
 thenRuleP = Then <$> seeRuleP `sepBy` (string " ")
 seeRuleP = See <$> decimal
 
-
-inputP = (,) <$> rulesP <* blankLines <*> messagesP
-
 messagesP = (munch1 isAlpha) `sepBy` endOfLine
 
 blankLines = skipMany1 endOfLine
index b322324de0b9d2c3622f27cbd519f56946be10ab..621040652ca7d2fff6ec3e6315efd5265806c990 100644 (file)
@@ -17,33 +17,26 @@ import Data.Either
 
 
 data Rule = Letter Char 
-          -- | Then2 Rule Rule
-          -- | Then3 Rule Rule Rule
           | Then [Rule]
           | Or Rule Rule
           | See Int
           deriving (Show, Eq)
 
--- data Tree = TEmpty
---           | TLetter Char
---           | TThen [Tree]
---           deriving (Show, Eq)
-
 
 type RuleSet = M.IntMap Rule
 
 
 main :: IO ()
 main = 
-  do  text <- TIO.readFile "data/advent19b.txt"
+  do  text <- TIO.readFile "data/advent19.txt"
       -- print text
       let (rules, messages) = successfulParse inputP text
       let messagesT = map T.pack messages
-      -- print rules
-      -- print messages
+      -- TIO.writeFile "rules19.atto.txt" $ T.pack $ show rules
+      print $ length rules
+      print $ length messages
       print $ part1 rules messagesT
       print $ part2 rules messagesT
-      -- print $ part2 text
 
 setup fname = 
   do text <- TIO.readFile fname
@@ -73,8 +66,8 @@ countMatches rules messages
 
 makeParser :: RuleSet -> Rule -> Parser ()
 makeParser m (Letter c) = void $ char c
-makeParser m (Then rs) = mapM_ (makeParser m) rs
-makeParser m (Or a b) = (makeParser m a) <|> (makeParser m b)
+makeParser m (Then rs) = mapM_ (\r -> try (makeParser m r)) rs
+makeParser m (Or a b) = (try (makeParser m a)) <|> (makeParser m b)
 makeParser m (See i) = makeParser m (m!i)
 
 
index 073d6cfb1ecaafc357920fa4d96c32b297b74389..2ff5e3c04a0825cf386a66992e6beba8b87202ad 100644 (file)
@@ -29,15 +29,14 @@ type RuleSet = M.IntMap Rule
 
 main :: IO ()
 main = 
-  do  text <- TIO.readFile "data/advent19b.txt"
-      -- print text
+  do  text <- TIO.readFile "data/advent19.txt"
       let (rules, messages) = successfulParse text
       let messagesT = map T.pack messages
-      -- print rules
-      -- print messages
+      -- TIO.writeFile "rules19.mega.txt" $ T.pack $ show rules
+      print $ length rules
+      print $ length messages
       print $ part1 rules messagesT
       print $ part2 rules messagesT
-      -- print $ part2 text
 
 setup fname = 
   do text <- TIO.readFile fname
@@ -49,7 +48,6 @@ setup fname =
      return (myParser, updatedRules, messagesT)
 
 
-
 part1 = countMatches
 
 part2 rules messages = countMatches updatedRules messages
@@ -60,18 +58,17 @@ countMatches rules messages
   = length 
   $ filter isRight 
   $ map (parse myParser "message") messages
-  where myParser = (makeParser rules (See 0)) -- <* eof
+  where myParser = (makeParser rules (See 0)) <* eof
 
 prettyResults rs = map p rs
   where p (Left e) = errorBundlePretty e
         p (Right r) = "^" ++ show r
 
-
 -- Generate the rules
 
 makeParser :: RuleSet -> Rule -> Parser ()
 makeParser m (Letter c) = void $ char c
-makeParser m (Then rs) = mapM_ (makeParser m) rs
+makeParser m (Then rs) = mapM_ (\r -> try (makeParser m r)) rs
 makeParser m (Or a b) = (try (makeParser m a)) <|> (makeParser m b)
 makeParser m (See i) = makeParser m (m!i)