diff --git a/2023/day11/day11.hs b/2023/day11/day11.hs index 689cc58..0f43412 100644 --- a/2023/day11/day11.hs +++ b/2023/day11/day11.hs @@ -1,3 +1,4 @@ +import Control.Arrow import Data.Function import Data.Ix import Control.Lens @@ -6,10 +7,10 @@ import Data.Ord import Linear.V2 main :: IO () -main = interact $ show . day11 . parse . lines +main = interact $ show . (day11 1 &&& day11 999999) . parse . lines -day11 :: [V2 Int] -> Int -day11 = (`div` 2) . sum . f . (expand =<< findEmptyRows) +day11 :: V2 Int -> [V2 Int] -> Int +day11 n = (`div` 2) . sum . f . (expandBy n =<< findEmptyRows) where f xs = [sum $ abs $ x-y | x<- xs, y<- xs] parse :: [String] -> [V2 Int] @@ -17,9 +18,9 @@ parse = map fst . filter ((=='#') . snd) . concat . zipWith (map . f) [0..] . ma where f x (y,z) = (V2 y x, z) -expand :: [V2 Int] -> [V2 Int] -> [V2 Int] -expand [] input = input -expand (d:ds) input = expand (map (moveCoord d) ds) (map (moveCoord d) input) +expandBy :: V2 Int -> [V2 Int] -> [V2 Int] -> [V2 Int] +expandBy _ [] input = input +expandBy n (d:ds) input = expandBy n (map (moveCoord n d) ds) (map (moveCoord n d) input) findEmptyRows :: [V2 Int] -> [V2 Int] @@ -29,6 +30,6 @@ findEmptyRows input = map flipV2 (findEmptyRows $ map flipV2 input) ++ findEmpt maxP = maximumBy (comparing (view _x)) input flipV2 (V2 x y) = V2 y x -moveCoord :: V2 Int -> V2 Int -> V2 Int -moveCoord x y = if y^.p >= x ^.p then y + signum x else y +moveCoord :: V2 Int -> V2 Int -> V2 Int -> V2 Int +moveCoord n x y = if y^.p >= x ^.p then y + n * signum x else y where p = if x^._x == 0 then _y else _x