Life Goes On

まあまあだけど楽しんでる方です

39問目

三角形の周の長さp=120のとき、直角三角形になるような辺の組は以下の3通りある。
{20,48,52}, {24,45,51}, {30,40,50}
1000未満のpについて、組合せの数が最大となるものを求める。
a < b < c, a + b > c で解を限定していますが、まだちょっと遅いです。制約条件が他にもあるのかな。

main = print $ euler039 999

euler039 :: Int -> Int
euler039 n = (+ 1) $ length $ takeWhile (< maximum lens) lens
    where lens = map (length . rightAngles) [1..n]

rightAngles :: Int -> [[Int]]
rightAngles p = [ [a, b, c] |
    a <- [1..(div p 3)],
    b <- [(max a ((div p 2)-a))+1..(div (p-a) 2)],
    let c = p - a - b, a^2 + b^2 == c^2]