|
|
|
@ -33,8 +33,7 @@ solveP1 = length . filter (== True) . map safeReportP1
|
|
|
|
|
solveP2 :: [[Int]] -> Int
|
|
|
|
|
solveP2 = length . filter (== True) . map safeReportP2
|
|
|
|
|
|
|
|
|
|
safeReportP1 :: [Int] -> Bool
|
|
|
|
|
safeReportP1 report = isSorted report && adjacentLevelCheck report
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSorted :: [Int] -> Bool
|
|
|
|
|
isSorted report = report `elem` [sort report, sortOn Down report]
|
|
|
|
@ -44,8 +43,17 @@ adjacentLevelCheck report =
|
|
|
|
|
all (((== True) . (\n-> n>=1 && n<=3)) . abs)
|
|
|
|
|
(zipWith subtract report (tail report))
|
|
|
|
|
|
|
|
|
|
safeReportP2 :: [Int] -> Bool
|
|
|
|
|
safeReportP2 report = any safeReportP1 (removeOneBadReport report)
|
|
|
|
|
|
|
|
|
|
removeOneBadReport :: [Int] -> [[Int]]
|
|
|
|
|
removeOneBadReport lst = map (\i -> take i lst <> drop (succ i) lst) [0..length lst-1]
|
|
|
|
|
removeOneBadReport lst = map (\i -> take i lst <> drop (succ i) lst) [0..(length lst)-1]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
safeReportP1 :: [Int] -> Bool
|
|
|
|
|
safeReportP1 report = isSorted report && adjacentLevelCheck report
|
|
|
|
|
|
|
|
|
|
safeReportP2 :: [Int] -> Bool
|
|
|
|
|
safeReportP2 report =
|
|
|
|
|
or $ zipWith (&&) (map adjacentLevelCheck reports) (map isSorted reports)
|
|
|
|
|
where
|
|
|
|
|
reports = removeOneBadReport report
|
|
|
|
|
|
|
|
|
|