diff options
| -rw-r--r-- | 19-1.hs | 24 | 
1 files changed, 9 insertions, 15 deletions
| @@ -1,11 +1,8 @@  import Control.Monad.ST -import Data.Foldable (foldrM)  import Data.HashTable.ST.Basic as H  import Data.List (nub)  import Data.Maybe (mapMaybe) -import Debug.Trace -  type S s = H.HashTable s String [String]  -- Return Nothing if no match; unmatched remainder (can be []) if @@ -24,17 +21,14 @@ matchAny s yss xs = do                 in H.insert s xs r >> return r      Just x -> return x -check :: S s -> [String] -> String -> ST s Bool -check s yss xs = do -  zss <- nub <$> matchAny s yss xs -  if [] `elem` zss -    then return True -    else anyM (check s yss) zss - -anyM :: Monad m => (a -> m Bool) -> [a] -> m Bool -anyM p = foldrM f False -  where -    f a b = (b ||) <$> p a +check :: S s -> [String] -> [String] -> ST s Bool +check s yss xss = do +  zss <- nub . concat <$> mapM (matchAny s yss) xss +  if null zss +    then return False +    else if [] `elem` zss +         then return True +         else check s yss zss  parseTowels :: String -> [String]  parseTowels = map init . words @@ -47,7 +41,7 @@ parse s = let yss = filter (not . null) . drop 2 $ lines s  run :: [String] -> [String] -> ST s Int  run xss yss = do    ht <- H.new :: ST s (S s) -  length . filter id <$> traverse (check ht yss) xss +  length . filter id <$> traverse (check ht yss . pure) xss  main :: IO ()  main = do |