X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=adventofcode1622%2Fapp%2Fadvent22showgrid.hs;fp=adventofcode1622%2Fapp%2Fadvent22showgrid.hs;h=aec4309ae330aaa971a032f106aef647895a3707;hb=245aed74ce202a0be5cf2f61f79b48ed51aa0e62;hp=0000000000000000000000000000000000000000;hpb=474b47bdae540d9e3e3a31a6fd9fbaf450dcc395;p=advent-of-code-16.git diff --git a/adventofcode1622/app/advent22showgrid.hs b/adventofcode1622/app/advent22showgrid.hs new file mode 100644 index 0000000..aec4309 --- /dev/null +++ b/adventofcode1622/app/advent22showgrid.hs @@ -0,0 +1,77 @@ +{-# LANGUAGE DeriveGeneric #-} + +module Main(main) where + +import GHC.Generics (Generic) +import Text.Parsec +import Text.ParserCombinators.Parsec.Number +import Data.Maybe (catMaybes, fromJust) +import Data.List (find, delete, sort, sortOn, reverse) + +data Node = Node { x :: Int + , y :: Int + , size :: Int + , used :: Int + , available :: Int + , use_pc :: Int + } deriving (Show, Eq, Ord) + + +testGrid = "\ +\Filesystem Size Used Avail Use%\n\ +\/dev/grid/node-x0-y0 10T 8T 2T 80%\n\ +\/dev/grid/node-x0-y1 11T 6T 5T 54%\n\ +\/dev/grid/node-x0-y2 32T 28T 4T 87%\n\ +\/dev/grid/node-x1-y0 9T 7T 2T 77%\n\ +\/dev/grid/node-x1-y1 8T 0T 8T 0%\n\ +\/dev/grid/node-x1-y2 11T 7T 4T 63%\n\ +\/dev/grid/node-x2-y0 10T 6T 4T 60%\n\ +\/dev/grid/node-x2-y1 9T 8T 1T 88%\n\ +\/dev/grid/node-x2-y2 9T 6T 3T 66%\n\ +\" + +main :: IO () +main = do + text <- readFile "data/advent22.txt" + let sizes = successfulParse $ parseFile text + let maxX = maximum $ map (\n -> x n) sizes + let maxY = maximum $ map (\n -> y n) sizes + putStrLn $ unlines $ map (showRow maxX sizes) [0..(maxY-1)] + + +showRow maxX sizes r = map (charOf) row + where row = sortOn (\c -> x c) $ filter (\c -> y c == r) sizes + charOf c = if (used c) == 0 + then '+' + else if (used c) > 100 + then '#' + else '_' + + + + +duFile = duLine `sepEndBy` newline +-- duLine = (optionMaybe nodeL) + +duLine = (nodeL >>= return . Just) <|> (headerL >> return Nothing) + +headerL = (many (noneOf "\r\n")) + +nodeL = nodeify <$> (string "/dev/grid/node-x" *> int) + <*> (string "-y" *> int) + <*> (spaces *> int <* string "T") + <*> (spaces *> int <* string "T") + <*> (spaces *> int <* string "T") + <*> (spaces *> int <* string "%") + where nodeify x y size used available use_pc = + Node {x=x, y=y, size=size, used=used, available=available, use_pc=use_pc} + +parseFile :: String -> Either ParseError [Maybe Node] +parseFile input = parse duFile "(unknown)" input + +parseLine :: String -> Either ParseError (Maybe Node) +parseLine input = parse duLine "(unknown)" input + +successfulParse :: Either ParseError [Maybe a] -> [a] +successfulParse (Left _) = [] +successfulParse (Right a) = catMaybes a