From 0356ed624f2a3cada3f8e9607a67b9021eae74f0 Mon Sep 17 00:00:00 2001 From: Christoph Stahl Date: Fri, 9 Dec 2022 13:58:29 +0100 Subject: [PATCH] Day 7:... --- day7.hs | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 day7.hs diff --git a/day7.hs b/day7.hs new file mode 100644 index 0000000..eb5d6e8 --- /dev/null +++ b/day7.hs @@ -0,0 +1,57 @@ +import Data.List +import qualified Data.Map.Strict as DMS +import Control.Monad.State.Lazy + +type Path = [String] +type FilesizeEntry = (Path, Int) + +path :: FilesizeEntry -> Path +path (p,_) = p + +filesize :: FilesizeEntry -> Int +filesize (_,i) = i + +normalizePath l|("..":_:r)<-l=r|let=l + +traversePath :: Path -> [String] -> [FilesizeEntry] +traversePath currentPath (line:input) + |"$ cd .." == line = traversePath (tail currentPath) input + |("$ cd ",directory)<-splitAt 5 line,normalizedPath<-directory:currentPath = traversePath normalizedPath input + |[(filesize, "")]<-reads$fst$head$lex line, (_, filename) <- span (/=' ') line = (tail filename:currentPath,filesize):traversePath currentPath input + |let=traversePath currentPath input +traversePath _ [] = [] + +recFiles :: Path -> [FilesizeEntry] -> [Int] +recFiles directory = map filesize.filter(\entry->directory `isSuffixOf` path entry) + +allDirectories = nub.map (tail.path) +gather :: [FilesizeEntry] -> [FilesizeEntry] +gather directoryFileEntries = [ (uniqueDirectory,sum$recFiles uniqueDirectory directoryFileEntries) | uniqueDirectory<-allDirectories directoryFileEntries] +sumsmall :: [FilesizeEntry] -> Int +sumsmall l=sum[f|(d,f)<-l, f<=100000] +main=interact$pprint[].take 20.traversePath [].lines + +updateOrInsert :: Int -> Maybe Int -> Maybe Int +updateOrInsert a (Just x) = Just (x+a) +updateOrInsert a _ = Just (a) + +files2folders :: [FilesizeEntry] -> State (DMS.Map Path Int) () +files2folders [] = return () +files2folders ((_:path, size):xs) = do + forM (init$tails path) (\part -> modify $ DMS.alter (updateOrInsert size) part) + files2folders xs + + + +pprint _ [] = [] +pprint cur (entry:list) + |cur == (tail $ path entry) = show(filesize entry) ++ " " ++ (head$path entry) ++ "\n" ++ pprint cur list + |otherwise = (tail$concat$intersperse "/"$reverse$tail$path entry) ++ "\n" ++ pprint (tail $ path entry) (entry:list) +-- t = map(\(h,t)->(h,sum t)) +-- t l=groupBy(\(i,_)(j,_)->i==j)$[(o,i)|(e,_)<-l,(o,i)<-l,isPrefixOf e o] +-- main=interact$show.map(foldr1(\(d,i)(c,j)->(d,i+j))).t.sort.x.lines +-- + +input = readFile "day7long" + +prepare = input >>= (return.traversePath [].lines)