In today’s Programming Praxis exercise, our task is to print a list of all Oban numbers (numbers that don’t have an o if you write them in words). Let’s get started, shall we?
Since any number higher than 999 will have either the word “thousand” or one of the -illions in it, we only have to implement spelling numbers less than a thousand. Spelling the numbers is a simple recursive algorithm. After spelling, we just take the ones that don’t have an o.
obans :: [Int] obans = filter (notElem 'o' . spell) [1..999] where spell n | n < 20 = ones !! n | n < 100 = tens !! div n 10 ++ spell (mod n 10) | True = spell (div n 100) ++ "hundred" ++ spell (mod n 100) ones = "" : words "one two three four five six seven eight \ \nine ten eleven twelve thirteen fourteen \ \fifteen sixteen seventeen eighteen nineteen" tens = "" : "" : words "twenty thirty forty fifty sixty \ \seventy eighty ninety"
Printing the numbers is trivial.
main :: IO () main = mapM_ print obans
If we instead say print $ length obans we see that there are indeed 454 Oban numbers, as there should be.