In today’s Programming Praxis exercise, our goal is to find all the words in a dictionary that satisfy two different criteria. Let’s get started, shall we?
First we have to find the words that have the five vowels in ascending order. To do this we simply check if the vowels in the words are equal to the five vowels in order.
ascVowels :: String -> Bool ascVowels = (== "aeiou") . filter (`elem` "aeiou")
The second game is to find all the six-letter words whose letters are ascending. All we need to check is check the length and whether the first letter of each pair of subsequent letters comes before the second one.
sixAsc :: Ord b => [b] -> Bool sixAsc s = length s == 6 && and (zipWith (<) s $ tail s)
All that’s left to do is to load the dictionary and print the appropriate words:
main :: IO () main = do ws <- fmap lines $ readFile "354984si.ngl" mapM_ putStrLn $ filter ascVowels ws putStrLn "---" mapM_ putStrLn $ filter sixAsc ws