62問目
http://projecteuler.net/index.php?section=problems&id=62
立方数 41063625 (3453) の数字を並べ替えると、他に2つの立方数 56623104 (3843) と 66430125 (4053) ができる。同様に、並べ替えると全部で5つの立方数ができるような数のうち、最小のものを求める。
立方数を生成して、並べ替えると等しくなるもの同士でグループ化して、メンバが5つのものを抜き出して、最小値を求める、という流れです。ロジックが一本道なので一行で書けますね。
import Data.List main = print $ euler062 euler062 :: Integer euler062 = head $ sort $ map (snd . head) $ filter ((== 5) . length) $ groupBy (\ a b -> fst a == fst b) $ sort $ (\ xs -> zip (map (sort . show) xs) xs) $ map (^ 3) [1..9999]