diff --git a/Day2/puzzle1.hs b/Day2/puzzle1.hs new file mode 100644 index 0000000..751737f --- /dev/null +++ b/Day2/puzzle1.hs @@ -0,0 +1,14 @@ +import Data.List (sort) +import System.IO + +isSafe :: [Int] -> Bool +isSafe xs = (isAscending xs || isDescending xs) && maximum distances <= 3 && minimum distances >= 1 + where isAscending xs = xs == sort xs + isDescending xs = xs == reverse (sort xs) + distances = map abs $ zipWith (-) xs (tail xs) + +main = do + contents <- lines <$> readFile "day2.txt" + let reports = map read . words <$> contents + safeCount = length $ filter isSafe reports + print safeCount diff --git a/Day2/puzzle2.hs b/Day2/puzzle2.hs new file mode 100644 index 0000000..f595599 --- /dev/null +++ b/Day2/puzzle2.hs @@ -0,0 +1,19 @@ +import Data.List (sort, inits, tails) +import System.IO + +isSafe :: [Int] -> Bool +isSafe xs = (isAscending xs || isDescending xs) && maximum distances <= 3 && minimum distances >= 1 + where isAscending xs = xs == sort xs + isDescending xs = xs == reverse (sort xs) + distances = map abs $ zipWith (-) xs (tail xs) + +removeLevel :: [Int] -> [[Int]] +removeLevel xs = zipWith (++) ys zs + where ys = map init $ tail (inits xs) + zs = map tail $ init (tails xs) + +main = do + contents <- lines <$> readFile "day2.txt" + let reports = map read . words <$> contents + safeCount = length . filter (any isSafe) $ map removeLevel reports + print safeCount