feat: finish day 5

This commit is contained in:
Victor Martinez 2025-03-14 09:49:24 +01:00
parent 76db862cb0
commit 63cba3eba2
2 changed files with 19 additions and 6 deletions

View file

@ -17,13 +17,22 @@ partOne :: String -> Either ParseError Int
partOne input = do partOne input = do
(rules, updates) <- parseInput input (rules, updates) <- parseInput input
return $ sum $ map middleElem $ filter (isValidUpdate rules) updates 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 :: 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 :: String -> Either ParseError (Set Rule, [Update])
parseInput content = case T.splitOn separator text of parseInput content = case T.splitOn separator text of

View file

@ -1,6 +1,6 @@
module Day5Spec (spec) where module Day5Spec (spec) where
import Day5 (partOne) import Day5 (partOne, partTwo)
import Test.Hspec import Test.Hspec
spec :: Spec spec :: Spec
@ -8,6 +8,10 @@ spec = do
describe "PartOne" $ do describe "PartOne" $ do
it "works" $ do it "works" $ do
partOne input `shouldBe` Right 143 partOne input `shouldBe` Right 143
describe "PartTwo" $ do
it "works" $ do
partTwo input `shouldBe` Right 123
where where
input = input =
"47|53\n\ "47|53\n\