diff --git a/hs/aoc2024.cabal b/hs/aoc2024.cabal index 7a2994cf..6b3728cb 100644 --- a/hs/aoc2024.cabal +++ b/hs/aoc2024.cabal @@ -39,7 +39,6 @@ executable aoc2024 aoc2024, base ^>=4.20.0.0, filepath ^>=1.5.2.0, - megaparsec ^>=9.7.0, text ^>=2.1.1 ghc-options: -no-hs-main -threaded -Wall default-language: GHC2024 diff --git a/hs/app/Main.hs b/hs/app/Main.hs index ced0cc47..d88274ad 100644 --- a/hs/app/Main.hs +++ b/hs/app/Main.hs @@ -9,7 +9,6 @@ import Data.Function (on) import Data.Maybe (fromMaybe) import Data.Text (Text) import qualified Data.Text.IO as TIO (putStrLn, readFile) -import Text.Megaparsec (errorBundlePretty) import System.Environment (getArgs, lookupEnv) import System.FilePath (combine) @@ -32,4 +31,4 @@ run' day name showIO funcs = do main :: IO () main = do - run 1 print [Day1.part1, Day1.part2] + run 1 (either fail print) [Day1.part1, Day1.part2] diff --git a/hs/src/Day1.hs b/hs/src/Day1.hs index a28920fd..cbecf240 100644 --- a/hs/src/Day1.hs +++ b/hs/src/Day1.hs @@ -4,19 +4,27 @@ Description: -} module Day1 (part1, part2) where +import Common (readEntire) import Data.Function (on) -import Data.IntMap (IntMap) import qualified Data.IntMap as IntMap (fromListWith, findWithDefault) import Data.List (sort, transpose) import Data.Text (Text) -import qualified Data.Text as T (lines, words, unpack) +import qualified Data.Text as T (lines, words) +import qualified Data.Text.Read as T (decimal) -part1 :: Text -> Int -part1 input = sum $ abs <$> cs where - [as, bs] = transpose $ map (map (read . T.unpack) . T.words) $ T.lines input - cs = (zipWith (-) `on` sort) as bs +parse :: Text -> Either String [[Int]] +parse = fmap transpose . mapM (mapM (readEntire T.decimal) . T.words) . T.lines -part2 :: Text -> Int -part2 input = sum [a * IntMap.findWithDefault 0 a cs | a <- as] where - [as, bs] = transpose $ map (map (read . T.unpack) . T.words) $ T.lines input - cs = IntMap.fromListWith (+) [(b, 1) | b <- bs] +part1 :: Text -> Either String Int +part1 input = case parse input of + Left err -> Left err + Right [as, bs] -> pure $ sum $ abs <$> (zipWith (-) `on` sort) as bs + _ -> Left "no parse" + +part2 :: Text -> Either String Int +part2 input = case parse input of + Left err -> Left err + Right [as, bs] -> + let cs = IntMap.fromListWith (($!) . (+)) [(b, 1) | b <- bs] + in pure $ sum [a * IntMap.findWithDefault 0 a cs | a <- as] + _ -> Left "no parse" diff --git a/hs/test/Day1Spec.hs b/hs/test/Day1Spec.hs index 227cc0fc..c826b725 100644 --- a/hs/test/Day1Spec.hs +++ b/hs/test/Day1Spec.hs @@ -20,7 +20,7 @@ spec :: Spec spec = do describe "part 1" $ do it "examples" $ do - part1 example `shouldBe` 11 + part1 example `shouldBe` Right 11 describe "part 2" $ do it "examples" $ do - part2 example `shouldBe` 31 + part2 example `shouldBe` Right 31