Advent of Code 2025
at main 1.1 kB view raw
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]