advent-of-code/seven.hs

65 lines
2.0 KiB
Haskell
Raw Normal View History

2022-12-16 20:59:53 +01:00
-- everything stolen from http://learnyouahaskell.com/zippers#a-very-simple-file-system
2022-12-16 19:37:44 +01:00
2022-12-16 20:59:53 +01:00
data FS = FS [Inode]
data Inode = Dir Name [Inode] | File Name Size deriving(Show)
2022-12-16 19:37:44 +01:00
type Name = String
type Size = Int
data Command = Ls | Cd Name | CdUp | CdRoot deriving(Show)
data Line = LineC Command | LineI Inode deriving(Show)
parseCommand :: String -> Command
parseCommand "ls" =Ls
parseCommand "cd .." =CdUp
2022-12-16 20:59:53 +01:00
parseCommand ('c':'d':' ':name) =(Cd name)
2022-12-16 19:37:44 +01:00
parseInode :: String -> Inode
parseInode ('d':'i':'r':' ': name) = Dir name []
parseInode input = File (drop 1 $ dropWhile (/= ' ') input) (read $ takeWhile (/= ' ') input)
parseEither :: String -> Line
parseEither ('$':' ':command) =LineC $ parseCommand command
parseEither input= LineI $ parseInode input
2022-12-16 20:59:53 +01:00
foldFunction :: FSZipper -> Line -> FSZipper
foldFunction zipper (LineC Ls) = zipper
foldFunction zipper (LineC (Cd name)) = fsTo name zipper
foldFunction zipper (LineC CdUp) = fsUp zipper
foldFunction zipper (LineI inode) = fsNewInode inode zipper
data FSCrumb = FSCrumb Name [Inode] [Inode] deriving (Show)
type FSZipper = (Inode,[FSCrumb])
fsUp :: FSZipper -> FSZipper
fsUp (item, FSCrumb name ls rs:bs) = (Dir name (ls ++ [item] ++ rs), bs)
fsUpToRoot :: FSZipper -> FSZipper
fsUpToRoot ((Dir "/" content),bc) = ((Dir "/" content),bc)
fsUpToRoot zipper = fsUp zipper
fsTo :: Name -> FSZipper -> FSZipper
fsTo name (Dir folderName items, bs) =
let (ls, item:rs) = break (nameIs name) items
in (item, FSCrumb folderName ls rs:bs)
nameIs :: Name -> Inode -> Bool
nameIs name (Dir folderName _) = name == folderName
nameIs name (File fileName _) = name == fileName
fsNewInode :: Inode -> FSZipper -> FSZipper
fsNewInode newInode ((Dir name content),bc) = (Dir name (newInode:content),bc)
initZipper :: FSZipper
initZipper = (Dir "/" [],[])
2022-12-16 19:37:44 +01:00
main = do
content <- readFile "seven-input.txt"
2022-12-16 20:59:53 +01:00
let statements = map parseEither $ drop 1 $ lines content
let a = foldl foldFunction initZipper statements
print $ fsUpToRoot a