X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent04%2FMain-interval.hs;fp=advent04%2FMain-interval.hs;h=7888faee5d8670d2ac17e1d63107eb078972f2cd;hb=6db626fdd0b191829d9a3ba276fc8c027fe67274;hp=0000000000000000000000000000000000000000;hpb=e999b6f2ed5c79428eb3842a5e13553370c5f9c3;p=advent-of-code-22.git diff --git a/advent04/Main-interval.hs b/advent04/Main-interval.hs new file mode 100644 index 0000000..7888fae --- /dev/null +++ b/advent04/Main-interval.hs @@ -0,0 +1,57 @@ +-- Writeup at https://work.njae.me.uk/2022/12/04/advent-of-code-2022-day-4/ + +import System.Environment +import Data.Text (Text) +import qualified Data.Text.IO as TIO +import Data.Attoparsec.Text hiding (Result) +import Numeric.Interval hiding (null) +-- import Control.Applicative + +type Assignment = Interval Int +type Pair = (Assignment, Assignment) + +main :: IO () +main = + do dataFileName <- getDataFileName + text <- TIO.readFile dataFileName + let pairs = successfulParse text + print $ part1 pairs + print $ part2 pairs + +getDataFileName :: IO String +getDataFileName = + do args <- getArgs + progName <- getProgName + let baseDataName = if null args + then progName + else head args + let dataFileName = "data/" ++ baseDataName ++ ".txt" + return dataFileName + +part1 :: [Pair] -> Int +part1 = length . (filter hasContainment) + +part2 :: [Pair] -> Int +part2 = length . (filter $ uncurry (==?)) + +hasContainment :: Pair -> Bool +hasContainment (assignment1, assignment2) = + (assignment1 `contains` assignment2) || (assignment2 `contains` assignment1) + + +-- Parse the input file + +pairsP :: Parser [Pair] +pairP :: Parser Pair +assignmentP :: Parser Assignment + +pairsP = pairP `sepBy` endOfLine +pairP = (,) <$> assignmentP <* "," <*> assignmentP + +assignmentP = (...) <$> decimal <* "-" <*> decimal + +successfulParse :: Text -> [Pair] +successfulParse input = + case parseOnly pairsP input of + Left _err -> [] -- TIO.putStr $ T.pack $ parseErrorPretty err + Right pairs -> pairs