Advent of Code 2025

Day 9

Changed files
+38 -2
src
+38 -2
src/Day9.hs
···
module Day9 where
+
import Util
+
+
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
-
part1 _ = "Day 9 part 1"
+
part1 input =
+
let pts = parse input
+
in show $
+
maximum $
+
[ area p q | p <- pts, q <- pts ]
+
+
uniq :: Eq a => [a] -> [a]
+
uniq [] = []
+
uniq [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
-
part2 _ = "Day 9 part 2"
+
part2 input =
+
let pts = parse input
+
edges = zip pts ((tail pts) ++ [head pts])
+
in show $
+
maximum $
+
[area p q | p <- pts, q <- pts, containsRect p q edges]