HCVB4TXZG6OCOQEZ5JBZB3PT7QVL2NYJHXCOLPVLAR73Z6CTKSJQC [Z] [W] [Z][D] [M] [L] [P] [G][S] [N] [R] [S] [F] [N][N] [J] [W] [J] [F] [D] [F][N] [H] [G] [J] [H] [Q] [H] [P][V] [J] [T] [F] [H] [Z] [R] [L] [M][C] [M] [C] [D] [F] [T] [P] [S] [S][S] [Z] [M] [T] [P] [C] [D] [C] [D]1 2 3 4 5 6 7 8 9move 3 from 9 to 6move 7 from 6 to 2move 1 from 1 to 5move 7 from 7 to 1move 3 from 9 to 7move 1 from 9 to 1move 1 from 7 to 2move 11 from 1 to 8move 9 from 8 to 2move 1 from 6 to 7move 3 from 7 to 3move 7 from 3 to 4move 9 from 8 to 7move 3 from 3 to 1move 2 from 5 to 2move 6 from 7 to 3move 1 from 1 to 7move 1 from 9 to 2move 1 from 5 to 3move 1 from 8 to 2move 2 from 7 to 5move 1 from 1 to 4move 3 from 5 to 8move 2 from 8 to 7move 1 from 8 to 9move 7 from 3 to 1move 8 from 2 to 5move 3 from 7 to 3move 1 from 5 to 1move 1 from 9 to 6move 1 from 7 to 4move 1 from 6 to 3move 1 from 7 to 1move 9 from 4 to 5move 8 from 1 to 2move 3 from 3 to 2move 1 from 1 to 6move 7 from 5 to 6move 1 from 1 to 5move 1 from 3 to 5move 21 from 2 to 3move 8 from 6 to 3move 5 from 4 to 9move 9 from 3 to 8move 17 from 3 to 5move 6 from 2 to 1move 2 from 9 to 1move 3 from 3 to 6move 3 from 2 to 5move 7 from 8 to 2move 3 from 6 to 9move 2 from 2 to 4move 1 from 2 to 6move 2 from 2 to 6move 2 from 6 to 5move 1 from 6 to 1move 2 from 2 to 7move 1 from 8 to 2move 4 from 9 to 1move 4 from 1 to 6move 1 from 8 to 5move 3 from 6 to 9move 1 from 9 to 1move 2 from 9 to 2move 4 from 4 to 5move 1 from 7 to 8move 1 from 7 to 5move 8 from 1 to 8move 1 from 1 to 9move 1 from 6 to 8move 2 from 2 to 6move 1 from 1 to 3move 1 from 2 to 5move 1 from 3 to 4move 3 from 9 to 4move 4 from 4 to 1move 29 from 5 to 1move 2 from 6 to 3move 2 from 3 to 5move 2 from 5 to 9move 7 from 8 to 1move 3 from 8 to 6move 6 from 1 to 6move 2 from 9 to 8move 2 from 5 to 3move 3 from 5 to 6move 2 from 5 to 6move 1 from 5 to 1move 2 from 3 to 9move 1 from 8 to 6move 1 from 8 to 3move 1 from 3 to 5move 5 from 1 to 5move 5 from 6 to 2move 25 from 1 to 9move 9 from 9 to 3move 7 from 6 to 8move 9 from 5 to 9move 2 from 6 to 5move 6 from 9 to 7move 1 from 6 to 8move 3 from 2 to 1move 3 from 8 to 1move 5 from 9 to 6move 3 from 9 to 1move 4 from 6 to 9move 2 from 7 to 4move 1 from 4 to 1move 1 from 6 to 2move 7 from 1 to 6move 1 from 9 to 8move 9 from 3 to 9move 5 from 1 to 7move 1 from 5 to 7move 3 from 1 to 7move 3 from 6 to 7move 8 from 9 to 1move 3 from 7 to 3move 1 from 5 to 6move 3 from 1 to 7move 4 from 1 to 4move 2 from 8 to 5move 1 from 4 to 2move 3 from 2 to 7move 2 from 6 to 4move 1 from 1 to 2move 18 from 7 to 5move 1 from 7 to 5move 1 from 2 to 3move 4 from 5 to 9move 1 from 2 to 1move 2 from 3 to 9move 2 from 3 to 4move 2 from 6 to 5move 1 from 8 to 3move 4 from 9 to 7move 1 from 1 to 9move 3 from 5 to 2move 2 from 8 to 6move 2 from 6 to 1move 5 from 5 to 7move 7 from 9 to 7move 11 from 5 to 9move 3 from 7 to 6move 6 from 4 to 9move 5 from 7 to 3move 6 from 3 to 6move 2 from 1 to 2move 2 from 4 to 9move 6 from 9 to 2move 1 from 7 to 5move 10 from 2 to 9move 4 from 9 to 4move 1 from 4 to 3move 31 from 9 to 3move 1 from 9 to 4move 6 from 3 to 8move 1 from 5 to 8move 5 from 6 to 4move 4 from 3 to 2move 1 from 4 to 6move 22 from 3 to 7move 6 from 4 to 7move 4 from 6 to 2move 8 from 8 to 1move 3 from 2 to 8move 2 from 1 to 9move 1 from 2 to 6move 3 from 2 to 5move 2 from 5 to 4move 2 from 6 to 4move 24 from 7 to 4move 1 from 7 to 4move 2 from 1 to 5move 2 from 9 to 6move 10 from 4 to 6move 3 from 1 to 6move 6 from 7 to 1move 2 from 2 to 3move 1 from 7 to 4move 2 from 8 to 4move 1 from 8 to 5move 4 from 5 to 2move 5 from 4 to 1move 2 from 7 to 8move 2 from 8 to 4move 5 from 6 to 3move 2 from 4 to 3move 1 from 7 to 5move 2 from 3 to 6move 1 from 5 to 1move 3 from 6 to 8move 11 from 4 to 3move 7 from 6 to 1move 3 from 8 to 1move 1 from 2 to 3move 2 from 6 to 9move 2 from 2 to 3move 3 from 4 to 3move 2 from 9 to 4move 1 from 6 to 3move 5 from 1 to 2move 2 from 4 to 3move 24 from 3 to 7move 3 from 3 to 9move 1 from 2 to 6move 1 from 2 to 5move 1 from 6 to 1move 4 from 2 to 1move 2 from 9 to 2move 1 from 2 to 4move 18 from 7 to 5move 1 from 2 to 1move 1 from 9 to 1move 2 from 5 to 7move 13 from 1 to 8move 3 from 4 to 9move 7 from 1 to 7move 13 from 7 to 6move 1 from 9 to 5move 3 from 4 to 3move 1 from 9 to 8move 3 from 1 to 3move 1 from 9 to 5move 2 from 1 to 4move 2 from 7 to 3move 4 from 3 to 1move 1 from 1 to 5move 9 from 6 to 7move 5 from 7 to 1move 2 from 4 to 1move 4 from 6 to 1move 3 from 5 to 3move 3 from 3 to 5move 7 from 1 to 6move 6 from 6 to 1move 1 from 6 to 8move 2 from 7 to 9move 2 from 1 to 5move 1 from 3 to 7move 7 from 5 to 9move 10 from 1 to 5move 8 from 8 to 4move 6 from 4 to 8move 1 from 4 to 1move 2 from 9 to 8move 2 from 1 to 3move 2 from 7 to 3move 1 from 7 to 8move 4 from 3 to 8move 1 from 3 to 2move 20 from 5 to 8move 1 from 2 to 4move 4 from 9 to 4move 4 from 4 to 5move 18 from 8 to 6move 3 from 9 to 6move 1 from 3 to 9move 10 from 8 to 7move 7 from 7 to 9move 7 from 8 to 5move 3 from 7 to 8move 6 from 5 to 1move 6 from 9 to 4move 1 from 9 to 6move 1 from 3 to 6move 1 from 8 to 5move 1 from 9 to 4move 12 from 6 to 7move 5 from 7 to 1move 6 from 8 to 5move 1 from 5 to 1move 3 from 5 to 3move 8 from 4 to 9move 2 from 3 to 7move 4 from 7 to 2move 10 from 5 to 6move 11 from 1 to 6move 4 from 2 to 5move 1 from 3 to 8move 1 from 8 to 9move 1 from 4 to 7move 3 from 7 to 4move 1 from 1 to 6move 1 from 4 to 7move 1 from 7 to 1move 4 from 5 to 2move 3 from 7 to 1move 2 from 4 to 8move 20 from 6 to 8move 4 from 1 to 5move 2 from 5 to 2move 6 from 6 to 1move 5 from 1 to 8move 7 from 6 to 2move 6 from 9 to 7move 2 from 9 to 8move 2 from 7 to 4move 4 from 2 to 6move 3 from 5 to 8move 12 from 8 to 7move 1 from 4 to 3move 1 from 2 to 9move 1 from 9 to 2move 1 from 6 to 8move 1 from 3 to 1move 2 from 1 to 6move 1 from 4 to 2move 3 from 6 to 2move 2 from 5 to 7move 1 from 9 to 8move 6 from 2 to 4move 17 from 7 to 1move 10 from 1 to 7move 4 from 2 to 6move 10 from 7 to 8move 3 from 6 to 2move 4 from 4 to 1move 2 from 6 to 4move 4 from 2 to 6move 1 from 7 to 1move 2 from 4 to 3move 12 from 1 to 7move 5 from 6 to 3move 17 from 8 to 2move 4 from 3 to 8move 1 from 4 to 2move 20 from 8 to 7move 19 from 2 to 6move 7 from 6 to 3move 7 from 3 to 5move 2 from 5 to 7move 4 from 6 to 9move 1 from 4 to 2move 1 from 2 to 1move 2 from 3 to 6move 1 from 2 to 6move 1 from 3 to 1move 4 from 6 to 2move 1 from 5 to 9move 7 from 7 to 3move 7 from 3 to 8move 5 from 8 to 1move 2 from 8 to 3move 1 from 2 to 1move 3 from 5 to 6move 1 from 3 to 9move 2 from 9 to 2move 8 from 1 to 7move 3 from 7 to 6move 2 from 2 to 4move 21 from 7 to 3move 10 from 3 to 1move 2 from 9 to 2move 7 from 3 to 4move 3 from 3 to 7move 4 from 2 to 3move 3 from 7 to 8move 1 from 3 to 6move 1 from 3 to 2move 4 from 7 to 9move 10 from 1 to 6move 1 from 5 to 9move 6 from 7 to 2move 24 from 6 to 5move 2 from 8 to 4move 1 from 8 to 6move 2 from 2 to 9move 5 from 2 to 7move 1 from 2 to 9move 11 from 4 to 1move 3 from 3 to 2move 4 from 9 to 7move 1 from 1 to 5move 1 from 6 to 1move 5 from 1 to 9move 5 from 9 to 7move 5 from 7 to 5move 23 from 5 to 2move 5 from 7 to 8move 6 from 5 to 6move 1 from 3 to 7move 1 from 5 to 7move 6 from 7 to 8move 3 from 6 to 1move 2 from 8 to 7move 4 from 2 to 1move 4 from 8 to 5move 7 from 2 to 3move 1 from 7 to 4move 1 from 4 to 7move 4 from 3 to 8move 6 from 1 to 9move 4 from 8 to 6move 3 from 1 to 5move 3 from 8 to 5move 1 from 1 to 8move 3 from 9 to 1move 3 from 6 to 7move 1 from 7 to 9move 3 from 8 to 3move 8 from 5 to 7move 11 from 2 to 8move 5 from 8 to 3move 1 from 8 to 7move 10 from 3 to 4move 2 from 5 to 8move 3 from 9 to 2move 1 from 9 to 6move 7 from 2 to 7move 6 from 9 to 4move 1 from 8 to 5move 3 from 6 to 8move 1 from 5 to 3move 2 from 3 to 1move 6 from 1 to 3move 13 from 7 to 5move 16 from 4 to 3move 2 from 1 to 5move 5 from 5 to 4move 11 from 3 to 4move 2 from 7 to 1move 7 from 3 to 1move 2 from 8 to 3move 8 from 1 to 9move 12 from 4 to 8move 1 from 1 to 4move 2 from 6 to 2move 3 from 7 to 8move 2 from 4 to 6move 5 from 8 to 1move 3 from 7 to 5move 6 from 5 to 7move 2 from 2 to 5move 1 from 4 to 9move 5 from 1 to 8move 6 from 3 to 1move 7 from 5 to 7move 7 from 9 to 2move 1 from 6 to 7move 1 from 1 to 9move 2 from 5 to 3move 2 from 9 to 6move 13 from 7 to 3move 2 from 6 to 1move 1 from 9 to 2move 16 from 8 to 7move 6 from 8 to 5move 3 from 2 to 5move 4 from 2 to 1move 3 from 1 to 8move 2 from 8 to 9move 1 from 8 to 7move 1 from 2 to 1move 8 from 3 to 1move 1 from 4 to 5move 1 from 6 to 3move 2 from 9 to 7move 5 from 1 to 4move 15 from 7 to 9move 11 from 9 to 3move 7 from 1 to 3move 2 from 1 to 6move 1 from 6 to 3move 2 from 4 to 5move 2 from 4 to 9move 7 from 5 to 9move 5 from 9 to 3move 1 from 1 to 6move 5 from 5 to 9move 1 from 4 to 8move 1 from 8 to 4move 3 from 7 to 4move 8 from 9 to 5move 1 from 6 to 4move 4 from 9 to 3move 1 from 9 to 3move 23 from 3 to 1move 12 from 1 to 2move 6 from 1 to 9move 5 from 9 to 7move 3 from 3 to 7move 6 from 4 to 3move 1 from 6 to 8move 6 from 1 to 2move 3 from 7 to 3move 3 from 2 to 5move 10 from 3 to 5move 1 from 1 to 8move 12 from 2 to 5move 3 from 2 to 9move 2 from 8 to 4move 13 from 5 to 1move 2 from 9 to 2move 2 from 1 to 3move 11 from 3 to 1move 2 from 2 to 1move 2 from 1 to 9move 16 from 1 to 7move 17 from 5 to 8move 1 from 1 to 2move 3 from 9 to 6
[D][N] [C][Z] [M] [P]1 2 3move 1 from 2 to 1move 3 from 1 to 3move 2 from 2 to 1move 1 from 1 to 2
module Main whereimport Data.Bifunctor (bimap, first, second)import Data.Listimport Data.Charimport Data.Maybeimport Control.Applicative ((<|>))import Text.ParserCombinators.ReadPimport Aocmain :: IO ()main = docontent <- input 5let run = Aoc.run contentrun "CNSZFDVLJ" (strategy reverse)run "QNDWLMGNS" (strategy id)wherestrategy a = map head . uncurry (foldl' $ flip (runProcedure a)) . bimap parseStack procedures . sectionstype Stack = [Crate]type Crate = Chardata Procedure = Move Int Int Intderiving ShowliftCrate :: Int -> [Stack] -> (Crate, [Stack])liftCrate i stacks = doLift (i - 1) stackswheredoLift :: Int -> [Stack] -> (Crate, [Stack])doLift 0 (x:xs) = (head x, (tail x):xs)doLift i (x:xs) = second (x:) $ doLift (i - 1) xsliftNCrate :: ([Crate] -> [Crate]) -> Int -> Int -> [Stack] -> ([Crate], [Stack])liftNCrate liftStrat count i stacks = doLift (i - 1) stackswheredoLift :: Int -> [Stack] -> ([Crate], [Stack])doLift 0 (x:xs) = (liftStrat . take count $ x, (drop count x):xs)doLift i (x:xs) = second (x:) $ doLift (i - 1) xsdropCrate :: Int -> Stack -> [Stack] -> [Stack]dropCrate i crates stacks = doDrop (i - 1) stackswheredoDrop :: Int -> [Stack] -> [Stack]doDrop 0 (x:xs) = (crates ++ x) : xsdoDrop i (x:xs) = x : doDrop (i - 1) xsdoDrop _ [] = []move :: ([Crate] -> [Crate]) -> Int -> Int -> Int -> [Stack] -> [Stack]move f count from to stack = dropCrate to lifted remainderwhere(lifted, remainder) = liftNCrate f count from stackrunProcedure :: ([Crate] -> [Crate]) -> Procedure -> [Stack] -> [Stack]runProcedure f (Move count from to) stack = move f count from to stacksections :: String -> ([String], [String])sections = bimap (init) (drop 1) . break null . linesparseStack :: [String] -> [String]parseStack = map (dropWhile (==' ')) . transpose . parseStrategy rowprocedures :: [String] -> [Procedure]procedures = parseStrategy procedureParserparseStrategy :: ReadP a -> [String] -> [a]parseStrategy a = map fst . map (head . readP_to_S a)-- moves <- procedures . snd . sections <$> sample 5-- stacks <- parseStack . fst . sections <$> sample 5-- foldl' (\a x -> runProcedure x a) stacks movestop :: [Stack] -> Stringtop = map head-- Parserscrate :: ReadP Cratecrate = between (char '[') (char ']') getemptyStack :: ReadP CrateemptyStack = docount 3 (satisfy isSpace)pure ' 'stack :: ReadP Cratestack = crate <|> emptyStackrow :: ReadP [Crate]row = manyTill (stack <* (optional (char ' '))) eof-- Procedure parserprocedureParser :: ReadP ProcedureprocedureParser = dostring "move "amount <- read <$> munch1 isDigitstring " from "from <- read <$> munch1 isDigitstring " to "to <- read <$> munch1 isDigitpure $ Move amount from to