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]]