···
+
parseLine :: [String] -> Point2
+
parseLine [x,y] = (read x, read y)
+
parse :: String -> [Point2]
+
parse s = map (parseLine . split ',') $ lines s
+
area :: Point2 -> Point2 -> Int
+
area (x,y) (z,w) = (abs (x - z) + 1) * (abs (y - w) + 1)
part1 :: String -> String
+
[ area p q | p <- pts, q <- pts ]
+
uniq :: Eq a => [a] -> [a]
+
uniq (a:b:cs) = if a == b then uniq (b:cs) else a : (uniq (b:cs))
+
edgeIntersect :: (Point2, Point2) -> (Point2, Point2) -> Bool
+
edgeIntersect (p,q) (r,s) =
+
max (fst r) (fst s) > min (fst p) (fst q) &&
+
min (fst r) (fst s) < max (fst p) (fst q) &&
+
max (snd r) (snd s) > min (snd p) (snd q) &&
+
min (snd r) (snd s) < max (snd p) (snd q)
+
containsRect :: Point2 -> Point2 -> [(Point2,Point2)] -> Bool
+
containsRect p q edges =
+
not $ or [edgeIntersect (p,q) e | e <- edges]
part2 :: String -> String
+
edges = zip pts ((tail pts) ++ [head pts])
+
[area p q | p <- pts, q <- pts, containsRect p q edges]