haskell: 2023 11 b

This commit is contained in:
Maciej Jur 2023-12-16 17:01:59 +01:00
parent ff96a275ea
commit 1ab2865a32
Signed by: kamov
GPG key ID: 191CBFF5F72ECAFD
3 changed files with 17 additions and 21 deletions

View file

@ -43,5 +43,5 @@ main = do
--run 08 Day08.parse Day08.solveA Day08.solveB
--run 09 Day09.parse Day09.solveA Day09.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

View file

@ -1,5 +1,5 @@
{-# LANGUAGE OverloadedStrings #-}
module Day11 (parse, solveA) where
module Day11 (parse, solveA, solveB) where
import Data.Void (Void)
import Data.Text (Text)
@ -31,19 +31,6 @@ parse = first errorBundlePretty . runParser grid ""
pairs :: [a] -> [(a, a)]
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 = bimap filterE (filterE . transpose) . join (,)
where
@ -53,8 +40,8 @@ expanded = bimap filterE (filterE . transpose) . join (,)
galaxies :: Grid -> [(Row, Col)]
galaxies = map fst . filter ((G ==) . snd) . withCoords
solveA :: Grid -> Int
solveA = do
solve :: Int -> Grid -> Int
solve m = do
gs <- galaxies
es <- expanded
return $ sum . map (distance es) . pairs $ gs
@ -66,8 +53,16 @@ solveA = do
crossed :: Int -> Int -> [Int] -> Int
crossed a b = length . filter (between a b)
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
-- Right 374
solveA :: Grid -> Int
solveA = solve 2
solveB :: Grid -> Int
solveB = solve 1000000

View file

@ -281,7 +281,8 @@ day11 :: Test
day11 =
let parsed = Day11.parse input
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
input =