diff options
| author | Shivesh Mandalia <mail@shivesh.org> | 2023-02-05 21:16:44 +0000 |
|---|---|---|
| committer | Shivesh Mandalia <mail@shivesh.org> | 2023-02-05 21:16:44 +0000 |
| commit | 8b88150f788aae5e7d5ab53f8d6a2a253a4a6b5b (patch) | |
| tree | 8a079a45d837a9d4f4bcbfa23bad33e75812b8ff /day07 | |
| parent | 4cb3fa6de434d287bb46ca94c3026880164cb774 (diff) | |
| download | AOC_2022_haskell-8b88150f788aae5e7d5ab53f8d6a2a253a4a6b5b.tar.gz AOC_2022_haskell-8b88150f788aae5e7d5ab53f8d6a2a253a4a6b5b.zip | |
Diffstat (limited to 'day07')
| -rw-r--r-- | day07/app/Main.hs | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/day07/app/Main.hs b/day07/app/Main.hs index 413fcca..223f7f7 100644 --- a/day07/app/Main.hs +++ b/day07/app/Main.hs @@ -121,6 +121,9 @@ Find the smallest directory that, if deleted, would free up enough space on the run the update. What is the total size of that directory? -} {-# LANGUAGE DerivingStrategies #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} + +{-# HLINT ignore "Use 'foldl'' from Relude" #-} module Main (main) where @@ -154,12 +157,19 @@ data SystemEntry a = File a | Directory Text [SystemEntry a] deriving stock (Sho root :: SystemEntry FileData root = Directory "/" [] -foldrEntry :: Monoid b => (a -> b -> b) -> b -> SystemEntry a -> b -foldrEntry f b (File fd) = f fd b -foldrEntry f b (Directory _ xs) = mconcat $ fmap (foldrEntry f b) xs +foldrFile :: Monoid b => (a -> b -> b) -> b -> SystemEntry a -> b +foldrFile f b (File fd) = f fd b +foldrFile f b (Directory _ xs) = mconcat $ fmap (foldrFile f b) xs + +foldrDirectory :: Monoid b => (a -> b -> b) -> b -> SystemEntry a -> [b] +foldrDirectory _ _ (File _) = [] +foldrDirectory f b (Directory n xs) = b' : concatMap (foldrDirectory f mempty) xs + where + b' = foldrFile f b (Directory n xs) +-- | Foldable over Files instance Foldable SystemEntry where - foldMap fam = foldrEntry (mappend . fam) mempty + foldMap fam = foldrFile (mappend . fam) mempty parseInput :: FilePath -> ByteString -> Either ParseError [Queries] parseInput = parse $ queries <* (eol <|> eof) @@ -208,13 +218,8 @@ run (Directory n ses) (ChangeDir d : qs) = run (Directory n (ses' : ses)) qs' run (Directory n ses) (List fd : qs) = run (Directory n (fmap File fd ++ ses)) qs run _ _ = error "invalid operation" -getSize :: SystemEntry FileData -> Int -getSize = getSum . foldr ((<>) . Sum . _size) (Sum 0) - getDirSizes :: SystemEntry FileData -> [Int] -getDirSizes (File _) = [] -getDirSizes (Directory n ses) = - getSize (Directory n ses) : foldl (\a d -> a ++ getDirSizes d) [] ses +getDirSizes = map getSum . foldrDirectory ((<>) . Sum. _size) (Sum 0) runPart1 :: [Queries] -> Int runPart1 = sum . filter (<= minSize) . getDirSizes . fst . run root . drop 1 @@ -228,6 +233,9 @@ runPart2 qs = minimum $ filter (>= requiredSpace - unusedSpace) $ getDirSizes sy systemEntry :: SystemEntry FileData systemEntry = fst $ run root $ drop 1 qs + getSize :: SystemEntry FileData -> Int + getSize = getSum . foldr ((<>) . Sum . _size) (Sum 0) + unusedSpace :: Int unusedSpace = totalSpace - getSize systemEntry |
