1406357289は0から9までの数字を1回ずつ使った数で、その一部を取り出したと きに以下のような面白い特性がある。
d1を1桁目の数字、d2を2桁目の数字としたときに、 d2d3d4 = 406は2で割り切れる、 d3d4d5 = 063は3で割り切れる、 d4d5d6 = 635は5で割り切れる、 d5d6d7 = 357は7で割り切れる、 d6d7d8 = 572は11で割り切れる、 d7d8d9 = 728は13で割り切れる、 d8d9d10 = 289は17で割り切れる。
この特性を持った全ての数の和を求めよ。
まず0から9のpermutationを求め、その中で問題の割り算の特性を持ったものだ けをfilterで取り出し、その和を求めることにする。ただしpermutationは各桁 の数字のリストなのでsumを適用する前にmapでlistToIntを適用する。
割り算の特性が成り立っているかどうかは関数divisibleで判別する。それぞれ の位置から3桁とりだし、割る数(素数を小さいほうから順番に並べたもの)で 割ったあまりのリストを求め、それが全て0のときに条件を満たす。
euler043 = sum $ map listToInt $ filter divisible $ permutation [0..9]
where divisible ns = all (== 0) [(listToInt $ take 3 $ drop (i - 1) ns)
`mod` (primes !! (i - 2))
| i <- [2..8]]
