diff --git a/src/Day2.hs b/src/Day2.hs index 01a3083..9b6e434 100644 --- a/src/Day2.hs +++ b/src/Day2.hs @@ -11,21 +11,30 @@ type Level = Int type Report = [Level] partOne :: String -> Either Error Int -partOne contents = length . filter isValidReport <$> parseInput contents - where - isValidReport xs = isValidReportWith isSafeIncrease xs || isValidReportWith isSafeDecrease xs - - isSafeIncrease x y = (x - y) > 0 && (x - y) < 4 - isSafeDecrease x y = isSafeIncrease y x - - isValidReportWith validator (x : y : xs) = validator x y && isValidReportWith validator (y : xs) - isValidReportWith _ [_] = True - isValidReportWith _ [] = False +partOne contents = length . filter isSafeReport <$> parseInput contents partTwo :: String -> Either Error Int -partTwo contents = calculateScore <$> parseInput contents +partTwo contents = length . filter isSafeReportWithTolerance <$> parseInput contents where - calculateScore _ = 0 + isSafeReportWithTolerance :: Report -> Bool + isSafeReportWithTolerance xs = isSafeReport xs || aux [] xs + where + aux left [] = isSafeReport left + aux left (x : xs') = isSafeReport (left ++ xs') || aux (left ++ [x]) xs' + +isSafeReport :: Report -> Bool +isSafeReport xs = isSafeReportWith isSafeIncrease xs || isSafeReportWith isSafeDecrease xs + +isSafeReportWith :: (Level -> Level -> Bool) -> Report -> Bool +isSafeReportWith validator (x : y : xs) = validator x y && isSafeReportWith validator (y : xs) +isSafeReportWith _ [_] = True +isSafeReportWith _ [] = False + +isSafeIncrease :: Level -> Level -> Bool +isSafeIncrease x y = (x - y) > 0 && (x - y) < 4 + +isSafeDecrease :: Level -> Level -> Bool +isSafeDecrease x y = isSafeIncrease y x parseInput :: String -> Either Error [Report] parseInput contents = mapM parseReport (lines contents)