Life Goes On

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

102問目

http://projecteuler.net/index.php?section=problems&id=102
与えられた三角形の中で原点を含むものの数を求める。
∠AOB, ∠BOC, ∠COA の外積を取って、全て正/全て負ならABCは原点を中心に反時計回り/時計回りに並んでいることになるので、原点を含むと分かります。

main =  print . euler102 . map (read . ("[" ++) . (++ "]")) . lines
    =<< readFile "triangles.txt"

euler102 :: [[Int]] -> Int
euler102 = length . filter containsOrigin . map crossProduct

crossProduct :: [Int] -> [Int]
crossProduct [xa,ya,xb,yb,xc,yc] = [xa*yb-xb*ya, xb*yc-xc*yb, xc*ya-xa*yc]

containsOrigin :: [Int] -> Bool
containsOrigin [ab, bc, ca] =
    (ab >= 0 && bc >= 0 && ca >= 0) || (ab <= 0 && bc <= 0 && ca <= 0)