haskell: 2023 03 b
This commit is contained in:
parent
7e33d41980
commit
2f0505d52f
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
Loading…
Reference in a new issue