···
5
+
parseLine :: [String] -> Point2
6
+
parseLine [x,y] = (read x, read y)
8
+
parse :: String -> [Point2]
9
+
parse s = map (parseLine . split ',') $ lines s
11
+
area :: Point2 -> Point2 -> Int
12
+
area (x,y) (z,w) = (abs (x - z) + 1) * (abs (y - w) + 1)
part1 :: String -> String
4
-
part1 _ = "Day 9 part 1"
16
+
let pts = parse input
19
+
[ area p q | p <- pts, q <- pts ]
21
+
uniq :: Eq a => [a] -> [a]
24
+
uniq (a:b:cs) = if a == b then uniq (b:cs) else a : (uniq (b:cs))
26
+
edgeIntersect :: (Point2, Point2) -> (Point2, Point2) -> Bool
27
+
edgeIntersect (p,q) (r,s) =
28
+
max (fst r) (fst s) > min (fst p) (fst q) &&
29
+
min (fst r) (fst s) < max (fst p) (fst q) &&
30
+
max (snd r) (snd s) > min (snd p) (snd q) &&
31
+
min (snd r) (snd s) < max (snd p) (snd q)
33
+
containsRect :: Point2 -> Point2 -> [(Point2,Point2)] -> Bool
34
+
containsRect p q edges =
35
+
not $ or [edgeIntersect (p,q) e | e <- edges]
part2 :: String -> String
7
-
part2 _ = "Day 9 part 2"
39
+
let pts = parse input
40
+
edges = zip pts ((tail pts) ++ [head pts])
43
+
[area p q | p <- pts, q <- pts, containsRect p q edges]