haskell: 2023 08 b
This commit is contained in:
parent
cd52310e9d
commit
f62f3404b3
|
@ -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
|
||||||
|
|
|
@ -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 ()
|
||||||
|
|
Loading…
Reference in a new issue