summaryrefslogtreecommitdiff
path: root/2-1.hs
blob: 934b08fafe3dd7093b28fdb1846f16cab063499b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
monotonic :: [Int] -> Bool
monotonic xs = all (<0) xs || all (>0) xs

gradual :: [Int] -> Bool
gradual = all ((<= 3) . abs)

differences :: [Int] -> [Int]
differences (x:y:xs) = x-y : differences (y:xs)
differences _ = []

safe :: [Int] -> Bool
safe xs = let ys = differences xs
  in monotonic ys && gradual ys

line :: String -> Bool
line = safe . map read . words

count :: (a -> Bool) -> [a] -> Int
count p = foldr f 0
  where
    f x y = if p x then succ y else y

main :: IO ()
main = do
  s <- getContents
  let ls = lines s
  let xs = map line ls
  print $ count id xs