main :: IO () main = do input <- readFile "input" let inList = map parseLine . lines $ input let safelist = map isSafeDamp inList print (count True safelist) parseLine = map (read :: String->Int) . words count x = length . filter (x ==) sublists xs = [[x | (x,j) <- zip xs [0..], j /= i] | i <- [0..length xs -1]] isSafeDamp = or . map isSafe . sublists isSafe levels = let diff = zipWith (-) levels (tail levels) absdiff = map abs diff in (all (> 0) diff || all (< 0) diff) && (minimum absdiff) >= 1 && (maximum absdiff) <= 3