aoc-25/app/Day9.hs
2026-01-08 00:34:21 +01:00

55 lines
1.4 KiB
Haskell

module Main where
import Data.List (uncons)
import Data.Maybe (mapMaybe)
import Data.Set (Set)
import Data.Set qualified as S
import System.Environment (getArgs)
main :: IO ()
main = do
input <- maybe (error "Missing argument to input file") (readFile . fst) =<< uncons <$> getArgs
putStrLn $ unwords ["Part 1:", show $ part1 input]
putStrLn $ unwords ["Part 2:", show $ part2 input]
area :: (Int, Int) -> (Int, Int) -> Int
area (x1, y1) (x2, y2) = x' * y'
where
x' = max x1 x2 - min x1 x2 + 1
y' = max y1 y2 - min y1 y2 + 1
parse :: String -> [(Int, Int)]
parse = mapMaybe (fmap fst . uncons . go) . lines
where
go :: String -> [(Int, Int)]
go s = do
(x, ',' : s1) <- reads s
(y, []) <- reads s1
pure (x, y)
combine :: (Ord a) => [a] -> [(a, a)]
combine as = S.toList $ foldl' (go as) S.empty as
where
go :: (Ord a) => [a] -> Set (a, a) -> a -> Set (a, a)
go as' pairs b = foldl' (\pairs' a -> if a /= b then S.insert (a, b) pairs' else pairs') pairs as'
-- | Idea: Generate pairs of all coordinates and calculate the area of
-- them. Take the maximum.
part1 :: String -> Int
part1 = maximum . map (uncurry area) . combine . parse
part2 :: String -> Int
part2 = error "Not implemented"
testInput :: String
testInput =
unlines
[ "7,1",
"11,1",
"11,7",
"9,7",
"9,5",
"2,5",
"2,3",
"7,3"
]