Project Euler 62

http://projecteuler.net/index.php?section=problems&id=62


Haskellで辞書は次のように使う。

import qualified Data.Map as M

m = M.insert 1 2 M.empty
n = m M.! 1         -- 2
b = M.member 1 m    -- True

3乗して各桁の数字を降順に並べて数にする。同じ数になるものをカウントする。

import Data.List
import qualified Data.Map as M

digits 0 = []
digits n = (digits (div n 10)) ++ [ mod n 10 ]
numerize a = foldl (\x y -> x * 10 + y) 0 a
normalize = numerize . reverse . sort . digits

next m n = if M.member cube m then
                if length (m M.! cube) == size - 1 then
                    head (m M.! cube) else
                    next (M.insert cube ((m M.! cube) ++ [n]) m) (n + 1)
                else
                    next (M.insert cube [n] m) (n + 1) where
                        cube = normalize (n^3)

size = 5
n = next M.empty 1
main = print (n^3)