Life Goes On

まあまあだけど楽しんでる方です

4問目

昨日はチビが夜更かししたせいでUPできなかったので、2問まとめて。
まず4問目。
http://projecteuler.net/index.php?section=problems&id=4
999以下の2数の積で、回文になるような最大の数を求めろというもの。
以下のように順番に試して、回文になったものを返します。
999と999→998001
999と998→997002
998と998→996004
999と997→996003
998と997→995006
999と996→995004

main = print $ euler004 1998 999

euler004 :: Integer -> Integer -> Integer
euler004 a b
    | isPalindrome(b * (a - b)) = b * (a - b)
    | (b == 999) = euler004 (a - 1) (div a 2)
    | otherwise = euler004 a (b + 1)

isPalindrome :: Integer -> Bool
isPalindrome i = (show i) == (reverse $ show i)

追記
つうか、たまたま答えが求められただけで、これじゃ駄目だろ。修正版

import Data.List

euler004 :: Integer
euler004 = foldl phi 0 [999,998..100]

phi :: Integer -> Integer -> Integer
phi m n = case find isPalindrome $ takeWhile (>m) $ map (n*) [n,n-1..100] of
  Nothing -> m
  Just p  -> p

isPalindrome :: Integer -> Bool
isPalindrome i = show i == reverse (show i)