haskell: 2023 08 b

This commit is contained in:
Maciej Jur 2023-12-08 21:46:12 +01:00
parent cd52310e9d
commit f62f3404b3
Signed by: kamov
GPG key ID: 191CBFF5F72ECAFD
2 changed files with 53 additions and 24 deletions

View file

@ -3,6 +3,7 @@ module Day08 (parse, solveA, solveB) where
import Data.Void (Void) import Data.Void (Void)
import Data.Text (Text) import Data.Text (Text)
import Data.List (transpose)
import Data.Bifunctor (first) import Data.Bifunctor (first)
import Text.Megaparsec (Parsec, errorBundlePretty, runParser, many, eof) import Text.Megaparsec (Parsec, errorBundlePretty, runParser, many, eof)
import Text.Megaparsec.Char (alphaNumChar, space, char) import Text.Megaparsec.Char (alphaNumChar, space, char)
@ -42,20 +43,6 @@ parse = first errorBundlePretty . runParser input ""
eof eof
return (path, ns) return (path, ns)
input :: Text
input =
"RL\n\
\\n\
\AAA = (BBB, CCC)\n\
\BBB = (DDD, EEE)\n\
\CCC = (ZZZ, GGG)\n\
\DDD = (DDD, DDD)\n\
\EEE = (EEE, EEE)\n\
\GGG = (GGG, GGG)\n\
\ZZZ = (ZZZ, ZZZ)\n"
run :: [Node] -> String -> [Dir] -> [(Int, String)] run :: [Node] -> String -> [Dir] -> [(Int, String)]
run ns start = helper 0 start . cycle run ns start = helper 0 start . cycle
where where
@ -72,8 +59,9 @@ solveA :: Input -> Int
solveA (ds, ns) = fst . head . filter (("ZZZ" ==) . snd) $ run ns "AAA" ds solveA (ds, ns) = fst . head . filter (("ZZZ" ==) . snd) $ run ns "AAA" ds
solveB :: Input -> Int solveB :: Input -> Int
solveB = const 1 solveB (ds, ns) = frequency . head . transpose . map (filter (('Z' ==) . last . snd)) $ toParallel ns
where
-- >>> solveA <$> parse input toParallel :: [Node] -> [[(Int, String)]]
-- Right 2 toParallel = map (($ ds) . run ns) . filter (('A' ==) . last) . map fst
frequency :: [(Int, String)] -> Int
frequency = foldl lcm 1 . map fst

View file

@ -10,6 +10,7 @@ import qualified Day04
import qualified Day05 import qualified Day05
import qualified Day06 import qualified Day06
import qualified Day07 import qualified Day07
import qualified Day08
day01 :: Test day01 :: Test
@ -156,6 +157,45 @@ day07 =
\KTJJT 220\n\ \KTJJT 220\n\
\QQQJA 483\n" \QQQJA 483\n"
day08 :: Test
day08 =
let parsedA1 = Day08.parse inputA1
parsedA2 = Day08.parse inputA2
parsedB = Day08.parse inputB
in TestList
[ TestCase $ assertEqual "A" (Right 2) (Day08.solveA <$> parsedA1)
, TestCase $ assertEqual "A" (Right 6) (Day08.solveA <$> parsedA2)
, TestCase $ assertEqual "B" (Right 6) (Day08.solveB <$> parsedB)
]
where
inputA1 =
"RL\n\
\\n\
\AAA = (BBB, CCC)\n\
\BBB = (DDD, EEE)\n\
\CCC = (ZZZ, GGG)\n\
\DDD = (DDD, DDD)\n\
\EEE = (EEE, EEE)\n\
\GGG = (GGG, GGG)\n\
\ZZZ = (ZZZ, ZZZ)\n"
inputA2 =
"LLR\n\
\\n\
\AAA = (BBB, BBB)\n\
\BBB = (AAA, ZZZ)\n\
\ZZZ = (ZZZ, ZZZ)\n"
inputB =
"LR\n\
\\n\
\11A = (11B, XXX)\n\
\11B = (XXX, 11Z)\n\
\11Z = (11B, XXX)\n\
\22A = (22B, XXX)\n\
\22B = (22C, 22C)\n\
\22C = (22Z, 22Z)\n\
\22Z = (22B, 22B)\n\
\XXX = (XXX, XXX)\n"
tests :: Test tests :: Test
tests = TestList tests = TestList
[ TestLabel "day01" day01 [ TestLabel "day01" day01
@ -165,6 +205,7 @@ tests = TestList
, TestLabel "day05" day05 , TestLabel "day05" day05
, TestLabel "day06" day06 , TestLabel "day06" day06
, TestLabel "day07" day07 , TestLabel "day07" day07
, TestLabel "day08" day08
] ]
main :: IO () main :: IO ()