diff --git a/executable/Main.hs b/executable/Main.hs index 39bf7c3..f60b5f4 100644 --- a/executable/Main.hs +++ b/executable/Main.hs @@ -31,3 +31,5 @@ main = do let demoInput4 = "2-4,6-8\n2-3,4-5\n5-7,7-9\n2-8,3-7\n6-6,4-6\n2-6,4-8" putStrLn $ show $ Day4.solveA demoInput4 putStrLn $ show $ Day4.solveA input4 + putStrLn $ show $ Day4.solveB demoInput4 + putStrLn $ show $ Day4.solveB input4 diff --git a/src/AoC/Day4.hs b/src/AoC/Day4.hs index 3787006..efc72f8 100644 --- a/src/AoC/Day4.hs +++ b/src/AoC/Day4.hs @@ -3,9 +3,9 @@ module AoC.Day4 where import Data.Text (Text) --- import qualified Data.Text as T import Data.Attoparsec.Text +import Data.Bits (xor) type Lower = Int type Higher = Int @@ -36,3 +36,16 @@ solveA :: Text -> Either String Int solveA txt = do lines' <- parseInput txt pure $ (length . filter (uncurry eitherIncluded)) lines' + +-------------------------------------------------------------------------------- +-- Part 2 +overlap :: Range1D -> Range1D -> Bool +overlap (Range1D l1 r1) (Range1D l2 r2) = (r1 >= l2) && (l1 <= r2) + +eitherOverlap :: Range1D -> Range1D -> Bool +eitherOverlap range1 range2 = range1 `overlap` range2 + +solveB :: Text -> Either String Int +solveB txt = do + lines' <- parseInput txt + pure $ (length . filter (uncurry eitherOverlap)) lines'