3797には面白い特徴がある。まずそれ自身が素数である。そして、左から右に 1桁ずつ数字を取り除いたときに、3797,797,97,7がそれぞれ素数である。右か ら左に取り除いた場合も3797,379,37,3が同様に素数である。
左右どちらからでも取り除く操作が可能な全ての11個の素数の和を求めよ。
注意:2,3,5,7は取り除くことが可能な数と考えない。
問題の条件の判定をする関数をtruncatableとして以下のように定義する。まず 対象の数を各桁のリストに分解し、そのリストをsplitAtで二つに分けたものの すべてが素数であるかどうかを調べる。この操作で左から取り除く場合と右か ら取り除く場合の両方を調べたことに相当する。そして10以上の素数の中でこ の条件を満たすものを11個取り出し和を求める。対象となる素数が11個である ことが問題文に与えられていることに依存している。
euler037 = sum $ take 11 $ filter truncatable $ dropWhile (<10) primes
where truncatable n = all bothPrime [ splitAt i ns
| i <- [1..(length ns - 1)]]
where ns = intToList n
bothPrime (a, b) = (isPrime $ listToInt a)
&& (isPrime $ listToInt b)
