X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent20.hs;h=3f43710703f82a8274c8216626547232a7b88a7b;hb=fd300170c824138ea4053ac30a18c25c5b5949e6;hp=aab974a15247afa21877c825d500096be36995d0;hpb=11ffef60b9cfbad37ecdabc2ec515179f52ca109;p=advent-of-code-16.git diff --git a/advent20.hs b/advent20.hs index aab974a..3f43710 100644 --- a/advent20.hs +++ b/advent20.hs @@ -1,4 +1,4 @@ -import Text.Parsec hiding (State) +import Text.Parsec import Text.ParserCombinators.Parsec.Number import Control.Applicative ((<$), (<*), (*>), (<*>), liftA) import Data.List (foldl') @@ -11,15 +11,12 @@ low (Interval l _) = l high :: Interval -> Int high (Interval _ h) = h --- input = 5 -input = 3012210 - main :: IO () main = do text <- readFile "advent20.txt" let intervals = successfulParse $ parseIfile text part1 intervals - -- part2 + part2 intervals part1 :: [Interval] -> IO () part1 intervals = print $ (+1) $ high $ head $ foldl' (mergeAdjacent) [] $ foldl' (merge) [] intervals @@ -28,13 +25,10 @@ part2 :: [Interval] -> IO () part2 intervals = do let ints = foldl' (mergeAdjacent) [] $ foldl' (merge) [] intervals let gapCount = gaps ints - let lowGap = max [0, ((low $ head ints) -1)] - let highGap = 4294967295 - (min [4294967295, ((high $ last ints) + 1)]) + let lowGap = low $ head ints + let highGap = 4294967295 - (high $ last ints) print (lowGap + gapCount + highGap) --- 4294967295 - - disjoint :: Interval -> Interval -> Bool disjoint (Interval a b) (Interval c d) | b < c = True @@ -62,25 +56,18 @@ mergeAdjacent (i1:intervals) i0 | low i0 == high i1 + 1 = (Interval (low i1) (high i0)):intervals | otherwise = i1:(mergeAdjacent intervals i0) - gaps :: [Interval] -> Int gaps [] = 0 gaps [_] = 0 gaps ((Interval _ b):(Interval c d):intervals) = (c - b - 1) + gaps ((Interval c d):intervals) - intervalFile = intervalLine `endBy` newline --- IntervalLine = choice [cpyL, incL, decL, jnzL] intervalLine = Interval <$> int <*> (string "-" *> int) - parseIfile :: String -> Either ParseError [Interval] parseIfile input = parse intervalFile "(unknown)" input -parseIline :: String -> Either ParseError Interval -parseIline input = parse intervalLine "(unknown)" input - successfulParse :: Either ParseError [a] -> [a] successfulParse (Left _) = [] successfulParse (Right a) = a