Problem 4

問題文(Project Euler - PukiWikiより)

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

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

自分が書いた答え
answer4 = maximum $ filter (\x -> show x == (reverse $ show x)) ns
ns = [x * y | x <- [100..999], y <-[100..999]]

ns の部分をリスト内包表記でこんなに綺麗にかけるとは思わなかった。内部的にはリストモナドらしい。リストモナドの動作原理を考える - あどけない話 で分かりやすく解説されている。

改善できそうな点

回文数のうち最大の数のものを答えれば良いので、ns を大きい順に回文数判定して最初に当たったものが答え。でもやり方が分からない…orz
全部ソートしてからfind を使うのは効率が悪い気がするが、遅延評価だから気にしなくて良いのかな? 誰か教えてください><