If you haven’t figured it out by now, I enjoy solving problems. And over the course of the last year or two, I’ve learned that interview questions make for great problems to work on. Actual interview problems are nice because they are usually quick, but have a quirk or two in there that makes them challenging, unlike simple questions like the Fizz Buzz problem that just checks if you have the most basic coding skills. (Has anyone actually been asked that question in an interview?)
The most recent problem I got to sink my teeth into (found it on a recruiting site, but not going to share where I got it; wouldn’t be fair to the company posting the problem) is for finding pangrams in sentences. If you don’t know what a pangram is Wikipedia defines them as, “a sentence using every letter of the alphabet at least once.” Yeah, I didn’t know what they were either until I started programming this little puzzle. Here is the code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
module Main (main) where import System (getArgs) import qualified Data.Set as S import qualified Data.Text as T import qualified Data.Text.IO as TI (readFile) buildList :: FilePath -> IO [T.Text] buildList filename = TI.readFile filename >>= return . map (T.toLower . T.filter (/=' ')) . T.lines compareAndPrint :: S.Set Char -> String compareAndPrint sset = if S.null result then "NULL" else S.toList result where result = S.difference (S.fromList ['a'..'z']) sset main = do args <- getArgs sentences <- buildList $ head args mapM_ (putStrLn . compareAndPrint) $ map( S.fromList . T.unpack) sentences
I came up with the solution pretty quickly by using Sets. Having a set of the alphabet and finding the difference of the letters used in the sentence makes the problem almost trivial. The hard part for me was figuring out how to filter out the spaces and change all characters to lower case in the buildList function. I eventually figured it out, but it took some head against wall action to get it right.
This is going to be my last post for this year. I would like to wish you all Happy Holidays and a Happy New Year. Thank for reading and see you again in 2012. I would also like to thank everyone from planet.haskell.org who decided to read this. Welcome!