8 | parseReport : String -> Maybe (List Integer)
9 | parseReport = traverse parseInteger . forget . split (== ' ')
11 | parseReports : String -> Maybe (List (List Integer))
12 | parseReports = traverse parseReport . lines
14 | ordered : (pred : a -> a -> Bool) -> List a -> Bool
15 | ordered pred [] = True
16 | ordered pred (x :: []) = True
17 | ordered pred (x :: (y :: xs)) =
19 | then ordered pred (y :: xs)
22 | maxStep : List Integer -> Integer
23 | maxStep is = maxStep' is 0
25 | maxStep' : (xs : List Integer) -> (acc : Integer) -> Integer
26 | maxStep' [] acc = acc
27 | maxStep' (x :: []) acc = acc
28 | maxStep' (x :: (y :: xs)) acc =
29 | let step = abs $
y - x
30 | next_acc = if step > acc then step else acc
31 | in maxStep' (y :: xs) next_acc
33 | safeReport : (report : List Integer) -> Bool
35 | if (ordered (<) report) || (ordered (>) report)
38 | then maxStep report <= 3
41 | deletions : List a -> List (List a)
44 | in case toVect len xs of
50 | let idxs = Data.Fin.List.allFins (S k)
51 | vects = map (\i => deleteAt i xs) idxs
54 | safeWithDeletion : (report : List Integer) -> Bool
55 | safeWithDeletion report =
56 | safeReport report || any safeReport (deletions report)
59 | part1 : String -> IO (String, List (List Integer))
61 | case parseReports str of
63 | putStrLn "Error parsing puzzle input"
66 | pure (show $
count safeReport reports, reports)
69 | part2 : (reports : List (List Integer)) -> String -> IO String
71 | pure . show $
count safeWithDeletion reports