私はプロジェクトオイラーの質問136を行っており、与えられた例をテストするために次のことを思いつきました。
module Main where
import Data.List
unsum x y z n = (y > 0) && (z > 0) && (((x*x) - (y*y)- (z*z)) == n) && ((x - y) == (y - z))
answer = snub $ takeWhile (<100) [n|x<-[1..],d<-[1..x`div`2],n<-[x..100],y<-[x-d],z<-[y-d], unsum x y z n ]
where
snub [] = []
snub (x:xs) | elem x xs = snub (filter (/=x) xs)
| otherwise = x : snub xs
snub
リストから重複する番号を削除します。
この例では、すべての数値が正である場合(または、質問から収集した場合)に25の解を与えることになっており、のような等差n
数列です。しかし、コードを使用すると、の11のソリューションのリストが返されます。x^2 - y^2 - z^2 == n
x-y == y-z
n
リスト内包表記で何を間違えたのでしょうか。また、見逃した最適化はありますか?