In today’s Programming Praxis exercise, our task is to write a function to determine if a number remains the same if it is rotated 180 degrees. Let’s get started, shall we?
The function is pretty simple: reverse the number, and for each digit check if it the rotation of the corresponding digit in the original number. If a non-reversible digit is encountered, we can return false immediately. An optimization that could be made is to only check half of the number (rounding up), but in this case speed is not an issue so I opted for cleaner code.
upsideUp :: Show a => a -> Bool upsideUp n = and . zipWith isRot (show n) . reverse $ show n where isRot a b = maybe False (== b) . lookup a $ zip "01689" "01986"
Two checks to see if everything is working properly:
main :: IO () main = do print $ head (filter upsideUp [1962..]) == 6009 print $ length (filter upsideUp [0..9999]) == 39