Advent of Code 2025
1module Day9 where
2
3import Util
4
5parseLine :: [String] -> Point2
6parseLine [x,y] = (read x, read y)
7
8parse :: String -> [Point2]
9parse s = map (parseLine . split ',') $ lines s
10
11area :: Point2 -> Point2 -> Int
12area (x,y) (z,w) = (abs (x - z) + 1) * (abs (y - w) + 1)
13
14part1 :: String -> String
15part1 input =
16 let pts = parse input
17 in show $
18 maximum $
19 [ area p q | p <- pts, q <- pts ]
20
21uniq :: Eq a => [a] -> [a]
22uniq [] = []
23uniq [a] = [a]
24uniq (a:b:cs) = if a == b then uniq (b:cs) else a : (uniq (b:cs))
25
26edgeIntersect :: (Point2, Point2) -> (Point2, Point2) -> Bool
27edgeIntersect (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)
32
33containsRect :: Point2 -> Point2 -> [(Point2,Point2)] -> Bool
34containsRect p q edges =
35 not $ or [edgeIntersect (p,q) e | e <- edges]
36
37part2 :: String -> String
38part2 input =
39 let pts = parse input
40 edges = zip pts ((tail pts) ++ [head pts])
41 in show $
42 maximum $
43 [area p q | p <- pts, q <- pts, containsRect p q edges]