import Aoc ( aocMain ) parseFile :: [String] -> [[Int]] parseFile = map (map read . words) part1 :: [[Int]] -> Int part1 reports = length $ filter isSafe $ map differences reports where differences xs = zipWith (-) xs (tail xs) isGradual dx = 1 <= abs dx && abs dx <= 3 isSafe dxs = all isGradual dxs && (all (<0) dxs || all (>0) dxs) part2 :: [[Int]] -> Int part2 reports = length $ filter isSafe $ map remove1 reports where remove n xs = let (front, back) = splitAt n xs in front ++ tail back remove1 report = map (`remove` report) [0..length report-1] isSafe = (>0) . part1 main :: IO () main = aocMain parseFile part1 part2