Haskell、小手先のテクニックはそこそこ身に付いてきた気がするが、
小手先のテクニック止まりでこれで良いのか感がある…。
Problem 37. Truncatable primes(切り詰め可能素数)
Zaneli.Euler.primesなどを利用できないかと思ったが、上手く今回の問題に合わせにくかったので
似たような構造の関数を別途作成した。
切り詰めた数値のリストの作り方を変えたものを2つ。
こちらは、concatMap (\i -> [take i, drop i]) [1..length ns-1]と、数値を切り詰める関数のリストを作り、
その関数を適用して作成される数値が全て素数のリストに入っていれば切り詰め可能素数とみなすようにしている。
ほとんど変わらないが、こちらはData.List.inits, tailsを使用している。
後者のほうがスマートに書けるかと思ったが、空リストと元の数値と一致するリストを除外するために
tail . init . fとゴチャゴチャした事をやっているのがイマイチな印象。
どちらも、-O オプション付きでコンパイルしても、1分くらいかかる…。
恐らく高速化の手段はあるはずだが、上手いやり方を思いつかなかった。
Problem 38. Pandigital multiples(パンデジタル倍数)
整数の連結積を再帰で作っていってパンデジタル数のみ取得して、最大値を求めるようにした。 proceed関数は、元々if xs == nub xs' then f (m+1) xs' else Nothingとしていたが、
if文でやるよりガードにしたほうが見通しがよいかと思いこうしたが、どう書くのが良かっただろうか…。
limitの出し方が適当なのも改善の余地があるように思う。
Problem 39. Integer right triangles(整数の直角三角形)
リスト内包表記で愚直に洗い出すようにしてみたが、こんな感じで良かったかな。
(三平方の定理がすぐに出てこなくてググったのは内緒)
※2014/3/25追記
こちらこちらのコメントを元にaとbの終了条件を見直す。
処理時間が euler39-1 は10秒程度に対して euler39-2 は2~3秒と、大幅に高速化した!

Copyright© 2011-2021 Shunsuke Otani All Right Reserved .