Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- module Main (main) where
- import System.Environment (getArgs)
- main :: IO ()
- main = do
- args <- getArgs
- let (d,b) = case args of
- (a1:a2:_) -> (read a1, read a2)
- (a1:_) -> (read a1, 113)
- _ -> (3, 113)
- mapM_ print [(n, digitList b n, digitList (b+2) n) | n <- filter (isPalindrome (b+2)) (makePalindromes b d)]
- isPalindrome :: Integer -> Integer -> Bool
- isPalindrome base n = (n `rem` base /= 0) && go n 0
- where
- go f b
- | f < b = False
- | otherwise = f' == b || go f' b'
- where
- (f',d) = f `quotRem` base
- b' = b * base + d
- digitList :: Integer -> Integer -> [Integer]
- digitList base n = go n []
- where
- go 0 xs = xs
- go k xs = case k `quotRem` base of
- (q,r) -> go q (r:xs)
- revert :: Integer -> Integer -> Integer
- revert base n = go n 0
- where
- go 0 r = r
- go m r = case m `quotRem` base of
- (q,d) -> go q (r * base + d)
- makePalindromes :: Integer -> Int -> [Integer]
- makePalindromes base d = do
- let low = base^(d-1)
- high = low * base
- n <- [low .. high-1]
- let b = revert base n
- m <- [0 .. base-1]
- return ((n * base + m)*high + b)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement