haskell: 2023 11 b
This commit is contained in:
parent
ff96a275ea
commit
1ab2865a32
|
@ -43,5 +43,5 @@ main = do
|
||||||
--run 08 Day08.parse Day08.solveA Day08.solveB
|
--run 08 Day08.parse Day08.solveA Day08.solveB
|
||||||
--run 09 Day09.parse Day09.solveA Day09.solveB
|
--run 09 Day09.parse Day09.solveA Day09.solveB
|
||||||
--run 10 Day10.parse Day10.solveA Day10.solveB
|
--run 10 Day10.parse Day10.solveA Day10.solveB
|
||||||
run 11 Day11.parse Day11.solveA Day11.solveA
|
run 11 Day11.parse Day11.solveA Day11.solveB
|
||||||
--run 15 Day15.parse Day15.solveA Day15.solveB
|
--run 15 Day15.parse Day15.solveA Day15.solveB
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
module Day11 (parse, solveA) where
|
module Day11 (parse, solveA, solveB) where
|
||||||
|
|
||||||
import Data.Void (Void)
|
import Data.Void (Void)
|
||||||
import Data.Text (Text)
|
import Data.Text (Text)
|
||||||
|
@ -31,19 +31,6 @@ parse = first errorBundlePretty . runParser grid ""
|
||||||
pairs :: [a] -> [(a, a)]
|
pairs :: [a] -> [(a, a)]
|
||||||
pairs xs = [(x, y) | (x:ys) <- tails xs, y <- ys]
|
pairs xs = [(x, y) | (x:ys) <- tails xs, y <- ys]
|
||||||
|
|
||||||
input :: Text
|
|
||||||
input =
|
|
||||||
"...#......\n\
|
|
||||||
\.......#..\n\
|
|
||||||
\#.........\n\
|
|
||||||
\..........\n\
|
|
||||||
\......#...\n\
|
|
||||||
\.#........\n\
|
|
||||||
\.........#\n\
|
|
||||||
\..........\n\
|
|
||||||
\.......#..\n\
|
|
||||||
\#...#.....\n"
|
|
||||||
|
|
||||||
expanded :: Grid -> ([Row], [Col])
|
expanded :: Grid -> ([Row], [Col])
|
||||||
expanded = bimap filterE (filterE . transpose) . join (,)
|
expanded = bimap filterE (filterE . transpose) . join (,)
|
||||||
where
|
where
|
||||||
|
@ -53,8 +40,8 @@ expanded = bimap filterE (filterE . transpose) . join (,)
|
||||||
galaxies :: Grid -> [(Row, Col)]
|
galaxies :: Grid -> [(Row, Col)]
|
||||||
galaxies = map fst . filter ((G ==) . snd) . withCoords
|
galaxies = map fst . filter ((G ==) . snd) . withCoords
|
||||||
|
|
||||||
solveA :: Grid -> Int
|
solve :: Int -> Grid -> Int
|
||||||
solveA = do
|
solve m = do
|
||||||
gs <- galaxies
|
gs <- galaxies
|
||||||
es <- expanded
|
es <- expanded
|
||||||
return $ sum . map (distance es) . pairs $ gs
|
return $ sum . map (distance es) . pairs $ gs
|
||||||
|
@ -66,8 +53,16 @@ solveA = do
|
||||||
crossed :: Int -> Int -> [Int] -> Int
|
crossed :: Int -> Int -> [Int] -> Int
|
||||||
crossed a b = length . filter (between a b)
|
crossed a b = length . filter (between a b)
|
||||||
distance :: ([Row], [Col]) -> ((Row, Col), (Row, Col)) -> Int
|
distance :: ([Row], [Col]) -> ((Row, Col), (Row, Col)) -> Int
|
||||||
distance (rs, cs) ((r1, c1), (r2, c2)) = abs (r1 - r2) + abs (c1 - c2) + crossed r1 r2 rs + crossed c1 c2 cs
|
distance (rs, cs) ((r1, c1), (r2, c2)) =
|
||||||
|
let dr = abs (r1 - r2)
|
||||||
|
dc = abs (c1 - c2)
|
||||||
|
m' = (m - 1)
|
||||||
|
er = m' * crossed r1 r2 rs
|
||||||
|
ec = m' * crossed c1 c2 cs
|
||||||
|
in dr + dc + er + ec
|
||||||
|
|
||||||
-- >>> solveA <$> parse input
|
solveA :: Grid -> Int
|
||||||
-- Right 374
|
solveA = solve 2
|
||||||
|
|
||||||
|
solveB :: Grid -> Int
|
||||||
|
solveB = solve 1000000
|
||||||
|
|
|
@ -281,7 +281,8 @@ day11 :: Test
|
||||||
day11 =
|
day11 =
|
||||||
let parsed = Day11.parse input
|
let parsed = Day11.parse input
|
||||||
in TestList
|
in TestList
|
||||||
[ TestCase $ assertEqual "A" (Right 374) (Day11.solveA <$> parsed)
|
[ TestCase $ assertEqual "A" (Right 374) (Day11.solveA <$> parsed)
|
||||||
|
, TestCase $ assertEqual "B" (Right 82000210) (Day11.solveB <$> parsed)
|
||||||
]
|
]
|
||||||
where
|
where
|
||||||
input =
|
input =
|
||||||
|
|
Loading…
Reference in a new issue