Project Euler – 問題52

125874とその2倍の251748は同じ数字を違う順序で並べたものである。

その数と2, 3, 4, 5, 6倍が全て同じ数字でできている最小の整数を求めよ。

1から順番にその数のrepeatと1..6をzipWithでかけたものが同じ数字でできて いるかどうかをチェックしていき、最初に見つかったものが解である。

同じ数字でできているかどうかのチェックはintToListで数を各桁の数字のリス トに分解し、それをソートしたものが全て同一かどうかでチェックする。同一 の場合はnubするとリストの長さが1になる。

euler052 = head $ head $ filter same [zipWith (*) (repeat i) [1..6] | i <- [1..]]
    where same xs = (length $ nub $ map (sort . intToList) xs) == 1