diff --git a/2023/day11/day11.hs b/2023/day11/day11.hs new file mode 100644 index 0000000..689cc58 --- /dev/null +++ b/2023/day11/day11.hs @@ -0,0 +1,34 @@ +import Data.Function +import Data.Ix +import Control.Lens +import Data.List +import Data.Ord +import Linear.V2 + +main :: IO () +main = interact $ show . day11 . parse . lines + +day11 :: [V2 Int] -> Int +day11 = (`div` 2) . sum . f . (expand =<< findEmptyRows) + where f xs = [sum $ abs $ x-y | x<- xs, y<- xs] + +parse :: [String] -> [V2 Int] +parse = map fst . filter ((=='#') . snd) . concat . zipWith (map . f) [0..] . map (zip [0..]) + 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) + + +findEmptyRows :: [V2 Int] -> [V2 Int] +findEmptyRows input = map flipV2 (findEmptyRows $ map flipV2 input) ++ findEmptyRows input + where findEmptyRows = deleteFirstsBy ((==) `on` view _x) b + b = range (V2 0 0, set _y 0 maxP) + 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 + where p = if x^._x == 0 then _y else _x diff --git a/2023/day11/expanded_testinput b/2023/day11/expanded_testinput new file mode 100644 index 0000000..64992d8 --- /dev/null +++ b/2023/day11/expanded_testinput @@ -0,0 +1,12 @@ +....#........ +.........#... +#............ +............. +............. +........#.... +.#........... +............# +............. +............. +.........#... +#....#....... diff --git a/2023/day11/input b/2023/day11/input new file mode 100644 index 0000000..16a603c --- /dev/null +++ b/2023/day11/input @@ -0,0 +1,140 @@ +.......#..............#.......................#............#.......#........................#.....#..................................#...... +.................................#.................................................#........................................................ +............................................................................................................................................ +..........................................................................................................#.............#................... +...........#...............................................................#..............................................................#. +.#.......................................................................................................................................... +................#.......#........................#....................#....................#.................................#.............. +......................................#.....#.........................................................#..................................... +...................................................................................#..........................#......................#...... +......#..................................................................................................................................... +.............#............................................#.......................................................#......................... +..................#.....................#..........#.....................................................#..............#.....#............. +.................................................................#.........#................................................................ +..................................#.................................................................................................#......# +....#..........#...........#..........................#.....#................................................#.............................. +................................................................................#........................................................... +.......................................#........#.......................#...........................#....................................... +.......................................................................................................................................#.... +.#..............................#.......................#........#.................#..............................#......................... +......#..............#....................#............................................................#.................#.................. +............#............................................................................................................................... +.....................................................................................................................#...................... +.....................................................#...................................................................................#.. +...............................................#...........................#.....#.......................................................... +....................................#........................................................................#.............................. +...........#.................#.........................................................#...........#............................#........... +.....#...............#....................................#...................................#........................................#.... +..........................................................................................................#................#................ +.......................................#..............#....................................................................................# +.................................#................................................#...................#.............#....................... +...#........#...............#.....................#............#.................................#.............#............................ +............................................................................................................................................ +.............................................#........................#..................................................................... +..........................................................#................................................#..............................#. +...................#...................#........................................#..............................................#............ +....#.....#.......................#...........................................................#.....#....................................... +........................................................................................#................................................... +..............................................#.........................................................#................................... +..........................#................................................#.............................................#..............#... +........#.....................................................#.......#..........................................................#.......... +.............#.............................#..........#..............................#.....................#................................ +............................................................................................................................................ +.#..............................................................................#.................#......................................... +......................#...............#..................................................................................................... +...................................................................#..................................................................#..... +..........#.................................................................................#......................#........................ +.................#........................#............................#.................................................................... +..........................................................#................................................#............#................... +..................................................#........................#...................................................#............ +..............................................................................................#..................#.......................... +............................................................................................................................................ +.....#...............................................................................................#...................................... +....................................#.......................................................................#........#...................... +...................#............................................................#..........#................................................ +.............................#..........................................................................................................#... +...............#...............................#..........#......................................#.....#.....................#.............. +.......#...............#.............................................................#............................................#......... +............................................................................................................................................ +...................................#.......#........#........#.................................................#............................ +............................................................................................................................................ +..........#..................#.........................................#..............................................................#..... +................................................#..........................................#................#....................#.......... +.........................................................#...........................#...................................................... +#....................#...........#.................................................................#..............#......#.................. +.............................................#.......#...................................................#.................................. +............................#...........................................................#.....#............................................. +.......#........................................................................#........................................................... +..........................................................#...................................................#....................#........ +...#...................................................................................................................#.................... +...............#.................#.......................................................................................................... +....................#.................#.......#..................#.........................#.............#.............................#.... +........................................................#...........................#....................................................... +...........................#...............................................#................................................................ +.#.......#........................................................................................#........................................# +................................#................................................................................#...............#.......... +....................................................#....................................................................................... +...................................................................#.....................................#...............#............#..... +....................................#......................#.............#..........#.....#................................................. +...........#................................................................................................................................ +.......................#.....................#.................................................................#............................ +.............................#..............................................#........................#...................................... +..................#................................................................................................#................#....... +..................................................#.........#..........#..................................................#................. +.................................#.......................................................#.................................................# +....#.......................................#.........#.......................................................................#............. +............................................................................................................................................ +............................................................................................................................................ +........................................................................#................................................................... +..#.............................................#................#....................................................#..................... +..............#...............#............................................................................................................. +........................#............................#..........................#........#.................................................. +...................................................................................................#...........#........................#... +....#.............#..............#............................................................................................#............. +............................................................................................................................................ +......................................................................................................#..................................... +.................................................................#......................#................................................... +.....................#....................#...........#.................#................................................................... +................................................................................#......................................#..........#........# +........#........................................................................................#.......................................... +..................................#.........................................................#....................#..........#............... +#...........................#...........................................................................#................................... +............#................................................#.........#...............#.................................................... +....#....................................................................................................................................... +..........................................#.....................................................#..............#..............#............. +............................................................................#.........................#.............#....................... +................................#.....#..................................................................................................... +...................#......#.................................#.......................#.......................#............................... +...........................................................................................#......#...............................#......... +#.............#.......................................#..................................................................................... +.............................#..............#.............................................................................................#. +......................#..................................................#............................#..............#...................... +........#........#.....................#...................#......#.............#............................#............#................. +.........................................................................................#......................................#........... +..................................#..................#............................................#...............#..................#...... +..........................#....................#............................................................................................ +..........................................#................................................................................................. +.#...................................................................#.......................#.............#...............................# +......#.......................#................................#.....................................................#...................... +............#.....#...................#............#.....#.......................#.................#........................................ +..........................................................................................................................#.....#......#.... +..........................................................................................#.............#................................... +...........................................#........................................#....................................................... +..#...................................................................#..................................................................... +.........#...........................................#...................................................................................... +....................................#............................................................#.................................#.......# +...........................#......................................................................................#......................... +..........................................................#............................................................#.................... +...#..........#........#.................................................................................................................... +....................................................................................#......#.................#..................#........... +..............................................................................#............................................................. +.............................#.......#.....#...................#........#......................#.....................................#...... +............................................................................................................................................ +..........#.....#...................................................#.............#.....................#....................#.............. +........................#.................................#.............................#...........................#....................... +........................................#...........#........................................#...........................................#.. +.....#.........................................#.................#.....#............................#....................................... +...................................#........................................#........#...................................................... +...........................................................................................................................#................ +.#............................#..........................#...................................................#.........................#.... +.........#...................................#..........................................#.........................#......................... diff --git a/2023/day11/testinput b/2023/day11/testinput new file mode 100644 index 0000000..986aad4 --- /dev/null +++ b/2023/day11/testinput @@ -0,0 +1,10 @@ +...#...... +.......#.. +#......... +.......... +......#... +.#........ +.........# +.......... +.......#.. +#...#.....