Skip to content

Commit fe889d9

Browse files
committed
Day 19: Parallelize and direct array access
1 parent 1b26733 commit fe889d9

File tree

3 files changed

+21
-13
lines changed

3 files changed

+21
-13
lines changed

hs/app/Main.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ main = do
7676
run 16 (maybe (fail "error") print) [Day16.part1, Day16.part2]
7777
run 17 (either (fail . errorBundlePretty) $ putStrLn . intercalate "," . map show) [Day17.part1, fmap (: []) . Day17.part2]
7878
run 18 (either fail putStrLn) [fmap show . Day18.part1, fmap (uncurry $ (. (',' :) . show) . shows) . Day18.part2]
79-
run 19 (uncurry (>>) . bimap print print) [Day19.solve]
79+
run 19 (maybe (fail "error") $ uncurry (>>) . bimap print print) [Day19.solve]
8080
run 20 print [Day20.solve 2 100, Day20.solve 20 100]
8181
run 21 print [Day21.solve 2, Day21.solve 25]
8282
run 22 (either fail print) [Day22.part1, Day22.part2]

hs/src/Day19.hs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,34 @@
11
{-# LANGUAGE OverloadedStrings #-}
2+
{-# LANGUAGE ViewPatterns #-}
23

34
-- |
45
-- Module: Day19
56
-- Description: <https://adventofcode.com/2024/day/19 Day 19: Linen Layout>
67
module Day19 (solve) where
78

8-
import Data.Bifunctor (bimap)
9+
import Control.Parallel.Strategies
910
import Data.Foldable (foldMap')
10-
import Data.Monoid (Sum (Sum, getSum))
11+
import Data.Monoid (Sum (Sum))
1112
import Data.Text (Text)
12-
import Data.Text qualified as T (isSuffixOf, length, lines, null, splitOn, take)
13+
import Data.Text qualified as T (lines, null, splitOn)
14+
import Data.Text.Array qualified as A (equal)
15+
import Data.Text.Internal (Text (Text))
16+
import Data.Text.Unsafe qualified as T (lengthWord8)
1317
import Data.Vector qualified as V (generate, (!))
1418

1519
count :: [Text] -> Text -> Int
16-
count keys target = getCount $ T.length target
20+
count keys target = getCount $ T.lengthWord8 target
1721
where
18-
counts = V.generate (T.length target) getCount
22+
counts = V.generate (T.lengthWord8 target) getCount
1923
getCount 0 = 1
20-
getCount i = sum [counts V.! (i - T.length key) | key <- keys, key `T.isSuffixOf` T.take i target]
24+
getCount i = sum [counts V.! (i - T.lengthWord8 key) | key <- keys, key `isSuffixOfAt` i $ target]
2125

22-
solve :: Text -> (Int, Int)
23-
solve input
24-
| keys : rest <- T.lines input =
25-
bimap getSum getSum . foldMap' ((Sum 1,) . Sum) . filter (> 0) $ count (T.splitOn ", " keys) <$> filter (not . T.null) rest
26-
| otherwise = (0, 0)
26+
isSuffixOfAt :: Text -> Int -> Text -> Bool
27+
isSuffixOfAt (Text a aoff alen) n (Text b boff blen) =
28+
alen <= n && n <= blen && A.equal a aoff b (boff + n - alen) alen
29+
30+
solve :: Text -> Maybe (Int, Int)
31+
solve (T.lines -> (T.splitOn ", " -> keys) : rest) | not $ any T.null keys = Just (part1, part2)
32+
where
33+
(Sum part1, Sum part2) = foldMap' ((Sum 1,) . Sum) . filter (> 0) . parMap rseq (count keys) $ filter (not . T.null) rest
34+
solve _ = Nothing

hs/test/Day19Spec.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@ spec :: Spec
2626
spec = do
2727
describe "solve" $ do
2828
it "examples" $ do
29-
solve example `shouldBe` (6, 16)
29+
solve example `shouldBe` Just (6, 16)

0 commit comments

Comments
 (0)