day 7: rewrite

use Data.Text

Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
2022-12-09 19:10:36 +05:30
parent 257e929dd2
commit 6a1a49bc96
2 changed files with 41 additions and 17 deletions

31
day7.hs
View File

@@ -1,12 +1,21 @@
{-# LANGUAGE OverloadedStrings #-}
import Data.Either (rights)
import Data.Text (Text)
import qualified Data.Text as T (head, lines, words)
import qualified Data.Text.Read as T (decimal)
import Data.Tree
import Lib (readFile')
-- this solution assumes that empty directories can exist,
-- if you want to ignore that, there is a slightly different code in day7'.hs
-- needs cleaning and improvement
-- needs cleaning and improvement, although i like the fact
-- that the entire FS can be printed as a tree
main :: IO ()
main = do
tree <- snd . flip parse (emptyFs "/") . map words . lines <$> readFile "day7.in"
tree <- snd . flip parse (emptyFs "/") . map T.words . T.lines <$> readFile' "day7.in"
putStr "Q1: "
print $
foldTree
@@ -26,18 +35,18 @@ main = do
)
tree
type Filesystem = Tree (String, Int)
type Filesystem = Tree (Text, Int)
tail' :: [a] -> [a]
tail' = drop 1
-- wrapper to create an empty tree
emptyFs :: String -> Filesystem
emptyFs :: Text -> Filesystem
emptyFs n = Node (n, 0) []
-- This function is to replace a filesystem by name
-- Used to replace empty directories with parsed directories in code
replaceFs :: Filesystem -> String -> Filesystem -> Filesystem
replaceFs :: Filesystem -> Text -> Filesystem -> Filesystem
replaceFs (Node n xs) name fs =
let (h, t) = span ((/= name) . fst . rootLabel) xs
in Node
@@ -50,11 +59,17 @@ totalSize :: [Filesystem] -> Int
totalSize = sum . map (snd . rootLabel)
-- All directories/files are parsed here into leaves
ls :: [[String]] -> [Filesystem]
ls = map (\[a, b] -> if a == "dir" then Node (b, 0) [] else Node (b, read a) [])
ls :: [[Text]] -> [Filesystem]
ls =
map
( \[a, b] ->
if a == "dir"
then Node (b, 0) []
else Node (b, fst . head $ rights [T.decimal a]) []
)
-- main function where stuff happens
parse :: [[String]] -> Filesystem -> ([[String]], Filesystem)
parse :: [[Text]] -> Filesystem -> ([[Text]], Filesystem)
parse input fs
| null input || cur == ["$", "cd", ".."] = (tail' input, fs)
| cur == ["$", "ls"] =