Project Euler – 問題4

回文になっている数はどちらから読んでも同一である。二つの2桁の数の積で作 られる回文で最大の数は9009=91×99である。

二つの3桁の数の積で作られる回文で最大のものを求めよ

例によってリストの内包表記で二つの3桁の数の積のうち回文になっているもの のリストを作ることにする。最大のものを求めるという問題の目的からして 100のような小さな数とか含める必要がないようにも思うがここは愚直に全てを 対象とした。maximum はリストの中から最大の要素を求める関数である。

問題となるのは回文かどうかを判定するところである。二つの3桁の数の積で最 大のものを求めるので対象の数は6桁と仮定。10万の位と1の位、1万の位と10の 位、1000の位と100の位が同じかどうかを比較することで回文の判定ができる。 美しさや汎用性はないがこれで答えは求まる。

isPalindrome6 n = (n `div` 100000) == (n `mod` 10)
                  && ((n `mod` 100000) `div` 10000) == ((n `mod` 100) `div` 10)
                  && ((n `mod` 10000) `div` 1000) == ((n `mod` 1000) `div` 100)

euler004 = maximum $ [x * y | x <- [100..999], y <- [100..999],
                      isPalindrome6 (x * y)]