Advertisement
Guest User

Untitled

a guest
Dec 15th, 2023
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. type Rx = (String, [Int])
  2. type Memo = M.Map Rx Int
  3.  
  4.  
  5. countRecursive :: (Memo, Int) -> Rx -> (Memo, Int)
  6. countRecursive (m, i) rx = putInMap . countCorrect m $ rx
  7.   where
  8.    putInMap (m, i) = (Map.insert rx i m, i)
  9.  
  10. countCorrect :: Memo -> Rx -> (Memo, Int)
  11. countCorrect m rx
  12.   | M.member rx m                   = (m, m M.! rx)
  13. countCorrect m    ([],        [])   = (m, 1)
  14. countCorrect m    ([],         _)   = (m, 0)
  15. countCorrect m rx@(s,         [])   = if noHashs s then (m, 1) else (m, 0)
  16. countCorrect m rx@(('#':s), (x:xs)) = if noDots (x-1) s && noHashAtPos (x-1) s then countRecursive m ((drop x s), xs) else (m, 0)
  17. countCorrect m rx@(('.':s),   xs)   = countCorrect m (s, xs)
  18. countCorrect m rx@(('?':s),   xs)   = mergeResults (countRecursive m (s, xs)) (countRecursive m (('#':s), xs))
  19.   where
  20.     mergeResults (m1, i1) (m2, i2) = (Map.union m1 m2, i1 + i2)
  21.  
  22.  
  23.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement