My blog. Like it? Subscribe to my feed or check out the archives.

Smallest Palindrome Bases in Haskell 26 Dec 09

Everybody loves palindromes, right? I do, at least. That's why I was excited when I learned that every number can be a palindrome when it's written in the appropriate base. There is a trivial proof for this property: any number N > 3 is a palindrome in base N-1 because it may be written "11". So here is my solution, in Haskell, to this CodeChef problem, that finds the smallest base that makes any given number a palindrome.

isPalindromeInBase :: Integer -> Integer -> Bool
isPalindromeInBase value base = step leftmost 1
    where leftmost = base ^ floor(log(fromInteger value) / log(fromInteger base))
          step left right
              | left <= right             = True
              | digit left == digit right = step (left `div` base) (right * base)
              | otherwise                 = False
          digit position = (value `div` position) `mod` base

smallestPalindromeBase :: Integer -> Integer
smallestPalindromeBase 1 = 2
smallestPalindromeBase 2 = 3
smallestPalindromeBase value = step 2
    where step base 
              | base >= value || isPalindromeInBase value base = base
              | otherwise                                      = step (base + 1)

main = interact (unlines . map (show . smallestPalindromeBase . read) . tail . lines)

This is certainly not the fastest solution possible. Indeed it is downright naive. But hopefully the logic is clear.

Post a comment