project euler problem 4

左右どちらから読んでも同じ値になる数を回文数という。 2桁の数の積で表される回文数のうち、最大のものは 9009 = 91 × 99 である。

では、3桁の数の積で表される回文数のうち最大のものはいくらになるか。

文字列に変換する方法にしばらく悩んだ 単なるshowだったw
文字列になればhaskellではreverseが簡単なのでisPalindromeという関数は不要

main = putStrLn $ show problem
problem = maximum $ filter (\x->(show x)==(reverse$show x)) $ map (\(x,y)->x*y) [(x,y)|x<-[100..999],y<-[100..999]]

内包表記は楽でいいなぁ。あと タプル(\(x,y)->x*y) が何ともいえない もしかしたらデフォルトで用意されている関数があるのかも

総当たり戦でもたいした時間はかからなかった。

追記 2010/08/02 16:07:40:

コメントにより判明

uncurry          :: (a -> b -> c) -> ((a, b) -> c)
uncurry f p      =  f (fst p) (snd p)


修正後

main = (putStrLn.show) problem
problem = (maximum.filter (\x->(show x)==(reverse$show x)).map (uncurry (*))) [(x,y)|x<-[10..99],y<-[10..99]]