X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=src%2Fadvent06%2Fadvent06.hs;h=46252ff2e092b1fcfc0da6256d12cf430d7adcbc;hb=8227e18e534ac192b718bbfe0592e81a30f2a433;hp=2ff18f51cc2cf9aaa8f0869838da685558f0256a;hpb=864aa7e1075c6b7c75037dc4b11afe4a30d73618;p=advent-of-code-18.git diff --git a/src/advent06/advent06.hs b/src/advent06/advent06.hs index 2ff18f5..46252ff 100644 --- a/src/advent06/advent06.hs +++ b/src/advent06/advent06.hs @@ -15,7 +15,7 @@ import qualified Control.Applicative as CA import qualified Data.Map.Strict as M type Coord = (Integer, Integer) -- x, y -type Bounds = (Integer, Integer, Integer, Integer) +type Bounds = (Integer, Integer, Integer, Integer) -- minX, maxX, minY, maxY type Region = M.Map Coord Int main :: IO () @@ -23,12 +23,8 @@ main = do text <- TIO.readFile "data/advent06.txt" let coords = successfulParse text let boundingBox = findBounds coords - print $ length coords - print boundingBox print $ part1 coords boundingBox print $ part2 coords boundingBox - -- print $ part1 activity - -- print $ part2 activity part1 coords bounds = largestRegion $ regionSizes $ finite edgeLabels regions @@ -50,17 +46,14 @@ nearestStart tieLabel cell starts = nearestLabel then tieLabel else snd (distances!!0) - safeCells :: [Coord] -> Bounds -> Region safeCells coords (minX, maxX, minY, maxY) = M.fromList distanceCells where cells = [(x, y) | x <- [minX .. maxX], y <- [minY .. maxY] ] distanceCells = map (\c -> (c, fromIntegral $ sumDistance c coords) ) cells - sumDistance :: Coord -> [Coord] -> Integer sumDistance here others = sum $ map (\c -> distance here c) others - infinite :: Region -> Bounds -> [Int] infinite regions (minX, maxX, minY, maxY) = nub $ sort $ M.elems $ M.filterWithKey onEdge regions where onEdge (x, y) _ = (x == minX) || (x == maxX) || (y == minY) || (y == maxY) @@ -69,20 +62,18 @@ finite :: [Int] -> Region -> Region finite excluded regions = M.filter (\r -> r `notElem` excludedTied) regions where excludedTied = (0:excluded) - regionSizes :: Region -> [(Int, Int)] regionSizes regions = map (\g -> (g!!0, length g)) $ group $ sort $ M.elems regions - largestRegion :: [(Int, Int)] -> Int largestRegion = maximum . map snd findBounds :: [Coord] -> (Integer, Integer, Integer, Integer) -findBounds coords = ( minX - (maxY - minY) -- small x edge - , maxX + (maxY - minY) -- large x edge - , minY - (maxX - minX) -- small x edge - , maxY + (maxX - minX) -- large y edge +findBounds coords = ( minX -- small x edge + , maxX -- large x edge + , minY -- small x edge + , maxY -- large y edge ) where maxX = maximum $ map fst coords minX = minimum $ map fst coords @@ -100,7 +91,6 @@ type Parser = Parsec Void Text sc :: Parser () sc = L.space (skipSome spaceChar) CA.empty CA.empty --- sc = L.space (skipSome (char ' ')) CA.empty CA.empty lexeme = L.lexeme sc integer = lexeme L.decimal @@ -108,7 +98,6 @@ symb = L.symbol sc commaP = symb "," - coordFileP = many coordP coordP = (,) <$> integer <* commaP <*> integer