haskell: 2023 03 b

This commit is contained in:
Maciej Jur 2023-12-03 20:02:28 +01:00
parent 7e33d41980
commit 2f0505d52f
Signed by: kamov
GPG key ID: 191CBFF5F72ECAFD
3 changed files with 21 additions and 12 deletions

View file

@ -28,7 +28,7 @@ day03 = do
Left err -> putStrLn err Left err -> putStrLn err
Right xd -> do Right xd -> do
print . Day03.solveA $ xd print . Day03.solveA $ xd
--print . Day02.solveB $ xd print . Day03.solveB $ xd
main :: IO () main :: IO ()
main = do main = do

View file

@ -5,9 +5,9 @@ import Data.Bifunctor (first, second)
import Data.Void (Void) import Data.Void (Void)
import Data.Char (digitToInt, isSpace) import Data.Char (digitToInt, isSpace)
import Data.Text (Text) import Data.Text (Text)
import Data.Maybe (mapMaybe)
import Text.Megaparsec (errorBundlePretty, Parsec, runParser, many, eof, choice, satisfy, manyTill) import Text.Megaparsec (errorBundlePretty, Parsec, runParser, many, eof, choice, satisfy, manyTill)
import Text.Megaparsec.Char (digitChar, char) import Text.Megaparsec.Char (digitChar, char)
import Data.Maybe (mapMaybe)
data Item data Item
@ -51,12 +51,12 @@ findSpans = helper []
withCoords :: [[a]] -> [((Row, Col), a)] withCoords :: [[a]] -> [((Row, Col), a)]
withCoords grid = [((r, c), a) | (r, row) <- zip [0..] grid, (c, a) <- zip [0..] row] withCoords grid = [((r, c), a) | (r, row) <- zip [0..] grid, (c, a) <- zip [0..] row]
getSymbols :: Grid -> [(Row, Col)] getSymbols :: Grid -> [(Char, (Row, Col))]
getSymbols = mapMaybe isSymbol . withCoords getSymbols = mapMaybe isSymbol . withCoords
where where
isSymbol :: ((Row, Col), Item) -> Maybe (Row, Col) isSymbol :: ((Row, Col), Item) -> Maybe (Char, (Row, Col))
isSymbol (rc, item) = case item of isSymbol (rc, item) = case item of
Symbol _ -> Just rc Symbol s -> Just (s, rc)
_ -> Nothing _ -> Nothing
getNumbers :: Grid -> [(Int, (Row, Col, Col))] getNumbers :: Grid -> [(Int, (Row, Col, Col))]
@ -82,15 +82,21 @@ getNeigbors (r, s, e) = [(r, s-1), (r, e+1)]
<> [(r-1, c) | c <- [s-1..e+1]] <> [(r-1, c) | c <- [s-1..e+1]]
<> [(r+1, c) | c <- [s-1..e+1]] <> [(r+1, c) | c <- [s-1..e+1]]
solveA :: [[Item]] -> Int solveA :: Grid -> Int
solveA grid = solveA grid =
let symbols = getSymbols grid let symbols = map snd $ getSymbols grid
numbers = getNumbers grid numbers = getNumbers grid
in sum . map fst . filter (hasSymbol symbols . snd) . map (second getNeigbors) $ numbers in sum . map fst . filter (hasSymbol symbols . getNeigbors . snd) $ numbers
where where
hasSymbol :: [(Row, Col)] -> [(Row, Col)] -> Bool hasSymbol :: [(Row, Col)] -> [(Row, Col)] -> Bool
hasSymbol symbols = any (`elem` symbols) hasSymbol symbols = any (`elem` symbols)
solveB :: [[Item]] -> Int solveB :: Grid -> Int
solveB = undefined solveB grid =
let symbols = map snd . filter (('*'==) . fst) $ getSymbols grid
numbers = map (second getNeigbors) $ getNumbers grid
in sum . map product . filter ((2==) . length) . map (findNumbers numbers) $ symbols
where
findNumbers :: [(Int, [(Row, Col)])] -> (Row, Col) -> [Int]
findNumbers ns symbol = map fst . filter ((symbol `elem`) . snd) $ ns

View file

@ -32,8 +32,11 @@ day02 = TestList
] ]
day03 :: Test day03 :: Test
day03 = TestList day03 =
[ TestCase $ assertEqual "A" (Right 4361) (Day03.solveA <$> Day03.parse input) let parsed = Day03.parse input
in TestList
[ TestCase $ assertEqual "A" (Right 4361) (Day03.solveA <$> parsed)
, TestCase $ assertEqual "B" (Right 467835) (Day03.solveB <$> parsed)
] ]
where where
input = input =