diff --git a/src/Day5.hs b/src/Day5.hs index 0d7a5d7..654b2a0 100644 --- a/src/Day5.hs +++ b/src/Day5.hs @@ -17,13 +17,22 @@ partOne :: String -> Either ParseError Int partOne input = do (rules, updates) <- parseInput input return $ sum $ map middleElem $ filter (isValidUpdate rules) updates - where - isValidUpdate rules update = sortBy (compareByRules rules) update == update - compareByRules rules x y = if member (x, y) rules then LT else GT - middleElem update = update !! (length update `div` 2) partTwo :: String -> Either ParseError Int -partTwo _ = Right 0 +partTwo input = do + (rules, updates) <- parseInput input + return $ sum $ map (middleElem . sortUpdate rules) $ filter (not . isValidUpdate rules) updates + +isValidUpdate :: Set Rule -> Update -> Bool +isValidUpdate rules update = sortUpdate rules update == update + +sortUpdate :: Set Rule -> Update -> Update +sortUpdate rules = sortBy compareByRules + where + compareByRules x y = if member (x, y) rules then LT else GT + +middleElem :: Update -> Int +middleElem update = update !! (length update `div` 2) parseInput :: String -> Either ParseError (Set Rule, [Update]) parseInput content = case T.splitOn separator text of diff --git a/test/Day5Spec.hs b/test/Day5Spec.hs index 14eb2b1..4614cde 100644 --- a/test/Day5Spec.hs +++ b/test/Day5Spec.hs @@ -1,6 +1,6 @@ module Day5Spec (spec) where -import Day5 (partOne) +import Day5 (partOne, partTwo) import Test.Hspec spec :: Spec @@ -8,6 +8,10 @@ spec = do describe "PartOne" $ do it "works" $ do partOne input `shouldBe` Right 143 + + describe "PartTwo" $ do + it "works" $ do + partTwo input `shouldBe` Right 123 where input = "47|53\n\