Life Goes On

まあまあだけど楽しんでる方です

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]