Life Goes On

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

91問目

http://projecteuler.net/index.php?section=problems&id=91
0≦x≦50, 0≦y≦50 の格子上に点 P, Q を置き、三角形 OPQ を考えるとき、△OPQ が直角三角形となるのは何通りあるか求める。
P, Q を適当に配置し、各頂点の内積を計算して直角三角形かどうかを判定しています。P の x 座標が Q の x 座標より大きいとき、逆に P の y 座標は Q の y 座標より小さくなるので、探索の範囲を少し狭めることができます。

main = print $ euler091 50

euler091 :: Int -> Int
euler091 m = length [ ((x1, y1), (x2, y2)) |
    x1 <- [1..m], y2 <- [1..m], y1 <- [0..y2], x2 <- [0..x1], (x1, y1) /= (x2, y2),
    x1 * x2 + y1 * y2 == 0 ||
    (x2-x1) * (-x1) + (y2-y1) * (-y1) == 0 ||
    (-x2) * (x1-x2) + (-y2) * (y1-y2) == 0 ]