From 51dbc7a1fb020128c0d1daec11fc1cfcbe4823dc Mon Sep 17 00:00:00 2001 From: qvalentin Date: Fri, 16 Dec 2022 19:37:44 +0100 Subject: [PATCH] Why is day seven so hard? --- seven-input.txt | 23 +++++++++++++++++++++++ seven.hs | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 seven-input.txt create mode 100644 seven.hs diff --git a/seven-input.txt b/seven-input.txt new file mode 100644 index 0000000..09a921e --- /dev/null +++ b/seven-input.txt @@ -0,0 +1,23 @@ +$ cd / +$ ls +dir a +14848514 b.txt +8504156 c.dat +dir d +$ cd a +$ ls +dir e +29116 f +2557 g +62596 h.lst +$ cd e +$ ls +584 i +$ cd .. +$ cd .. +$ cd d +$ ls +4060174 j +8033020 d.log +5626152 d.ext +7214296 k diff --git a/seven.hs b/seven.hs new file mode 100644 index 0000000..9a2c80f --- /dev/null +++ b/seven.hs @@ -0,0 +1,34 @@ +data FS = FS [Inode] + +data Inode = Dir Name [Inode] | File Name Size deriving(Show) + +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 ('c':'d':' ':name) =(Cd name) +parseCommand "ls" =Ls +parseCommand "cd .." =CdUp +parseCommand "cd /" =CdRoot + +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 + + + +main = do + content <- readFile "seven-input.txt" + let statements = map parseEither $ lines content + print statements