Done day 5
authorNeil Smith <NeilNjae@users.noreply.github.com>
Mon, 5 Dec 2022 10:16:44 +0000 (10:16 +0000)
committerNeil Smith <NeilNjae@users.noreply.github.com>
Mon, 5 Dec 2022 11:12:48 +0000 (11:12 +0000)
advent-of-code22.cabal
advent05/Main.hs [new file with mode: 0644]
data/advent05.txt [new file with mode: 0644]
data/advent05a.txt [new file with mode: 0644]
problems/day05.html [new file with mode: 0644]

index ca418749b82df36bb26e4a190b41eedc89dcc372..7a73e22557ab17d76e9e4d8d2be64a5f1e8a5f9c 100644 (file)
@@ -114,3 +114,8 @@ executable advent04i
   import: common-extensions, build-directives
   main-is: advent04/Main-interval.hs
   build-depends: text, attoparsec, intervals
+
+executable advent05
+  import: common-extensions, build-directives
+  main-is: advent05/Main.hs
+  build-depends: text, attoparsec, containers
diff --git a/advent05/Main.hs b/advent05/Main.hs
new file mode 100644 (file)
index 0000000..9ec1d25
--- /dev/null
@@ -0,0 +1,124 @@
+-- Writeup at https://work.njae.me.uk/2022/12/04/advent-of-code-2022-day-4/
+
+import System.Environment
+import Data.Text (Text)
+import qualified Data.Text.IO as TIO
+import Data.Attoparsec.Text hiding (take)
+import Control.Applicative
+import Data.List
+import Data.Maybe
+import qualified Data.IntMap.Strict as M
+import Data.IntMap.Strict ((!), (!?))
+
+data Crate = Crate Char deriving (Show, Eq)
+type Wharf = M.IntMap [Crate]
+
+data Move = Move Int Int Int -- quantity, from, to
+  deriving (Show, Eq)
+
+
+main :: IO ()
+main = 
+  do  dataFileName <- getDataFileName
+      text <- TIO.readFile dataFileName
+      let ((wharfLines, colNames), moves) = successfulParse text
+      -- print wharfLines
+      -- print colNames
+      -- print moves
+      let wharf = makeWharf wharfLines colNames
+      -- print wharf
+      -- print $ applyMove wharf (head moves)
+      putStrLn $ part1 wharf moves
+      putStrLn $ part2 wharf moves
+
+
+getDataFileName :: IO String
+getDataFileName =
+  do args <- getArgs
+     progName <- getProgName
+     let baseDataName =  if null args
+                         then progName
+                         else head args 
+     let dataFileName = "data/" ++ baseDataName ++ ".txt"
+     return dataFileName
+
+
+part1 :: Wharf -> [Move] -> String
+part1 wharf moves = showTops $ applyMoves1 wharf moves
+
+part2 :: Wharf -> [Move] -> String
+part2 wharf moves = showTops $ applyMoves2 wharf moves
+
+showTops :: Wharf -> String
+showTops wharf = fmap extractName $ fmap (head . snd) $ M.toAscList wharf
+
+extractName :: Crate -> Char
+extractName (Crate c) = c        
+
+makeWharf :: [[Maybe Crate]] -> [Int] -> Wharf
+makeWharf wharfLines colNames = M.fromList $ zip colNames wharfCols
+  where wharfCols = fmap (fmap fromJust)
+                  $ fmap (dropWhile isNothing) 
+                  $ transpose wharfLines
+
+applyMoves1 :: Wharf -> [Move] -> Wharf
+applyMoves1 wharf moves = foldl' applyMove1 wharf moves
+
+applyMove1 :: Wharf -> Move -> Wharf
+applyMove1 wharf m@(Move n _ _) = foldl' makeMove1 wharf (replicate n m)
+
+makeMove1 :: Wharf -> Move -> Wharf
+makeMove1 wharf (Move _ from to) = M.insert from origin 
+                                 $ M.insert to destination wharf
+  where (c:origin) = wharf!from
+        destination = c:(fromMaybe [] $ wharf!?to)
+
+applyMoves2 :: Wharf -> [Move] -> Wharf
+applyMoves2 wharf moves = foldl' applyMove2 wharf moves
+
+applyMove2 :: Wharf -> Move -> Wharf
+applyMove2 wharf (Move n from to) = M.insert from origin' 
+                                  $ M.insert to destination wharf
+  where origin = wharf!from
+        moving = take n origin
+        origin' = drop n origin
+        destination = moving ++ (fromMaybe [] $ wharf!?to)
+
+
+-- Parse the input file
+
+problemP :: Parser (([[Maybe Crate]], [Int]), [Move])
+wharfP :: Parser ([[Maybe Crate]], [Int])
+wharfLineP :: Parser [Maybe Crate]
+wharfCellP, blankP, crateP :: Parser (Maybe Crate)
+stackLabelsP :: Parser [Int]
+movesP :: Parser [Move]
+moveP :: Parser Move
+
+-- problemP = (,) <$> wharfP <* endOfLine <* endOfLine <*> movesP
+problemP = (,) <$> wharfP <*> movesP
+
+wharfP = (,) <$> (wharfLineP `sepBy` endOfLine) <*> stackLabelsP
+
+wharfLineP = wharfCellP `sepBy1` (char ' ')
+
+wharfCellP = crateP <|> blankP
+blankP = Nothing <$ (count 3 space)
+crateP = (Just . Crate) <$> ("[" *> letter) <* "]"
+
+-- stackLabelsP = ((many1 space) *> (decimal `sepBy` (many1 space))) <* (takeWhile1 isHorizontalSpace)
+stackLabelsP = (many1 space) 
+            *> (decimal `sepBy` (many1 space)) 
+            <* (many1 space)
+
+movesP = moveP `sepBy` endOfLine
+moveP = Move <$> ("move " *> decimal) 
+             <*> (" from " *> decimal) 
+             <*> (" to " *> decimal)
+
+
+successfulParse :: Text -> (([[Maybe Crate]], [Int]), [Move])
+successfulParse input = 
+  case parseOnly problemP input of
+    Left  _err -> (([], []), []) -- TIO.putStr $ T.pack $ parseErrorPretty err
+    Right problem -> problem
diff --git a/data/advent05.txt b/data/advent05.txt
new file mode 100644 (file)
index 0000000..fb137f9
--- /dev/null
@@ -0,0 +1,512 @@
+[M]                     [N] [Z]    
+[F]             [R] [Z] [C] [C]    
+[C]     [V]     [L] [N] [G] [V]    
+[W]     [L]     [T] [H] [V] [F] [H]
+[T]     [T] [W] [F] [B] [P] [J] [L]
+[D] [L] [H] [J] [C] [G] [S] [R] [M]
+[L] [B] [C] [P] [S] [D] [M] [Q] [P]
+[B] [N] [J] [S] [Z] [W] [F] [W] [R]
+ 1   2   3   4   5   6   7   8   9 
+
+move 5 from 3 to 6
+move 2 from 2 to 5
+move 1 from 9 to 1
+move 1 from 3 to 1
+move 5 from 7 to 5
+move 2 from 9 to 8
+move 1 from 2 to 8
+move 1 from 4 to 2
+move 8 from 1 to 6
+move 4 from 6 to 9
+move 1 from 2 to 1
+move 2 from 4 to 8
+move 2 from 8 to 4
+move 3 from 7 to 5
+move 6 from 5 to 3
+move 1 from 1 to 8
+move 1 from 5 to 7
+move 5 from 6 to 9
+move 3 from 5 to 8
+move 2 from 4 to 3
+move 1 from 7 to 8
+move 2 from 8 to 6
+move 2 from 1 to 8
+move 8 from 3 to 8
+move 11 from 6 to 3
+move 1 from 4 to 7
+move 1 from 3 to 7
+move 2 from 6 to 1
+move 7 from 9 to 7
+move 10 from 3 to 5
+move 1 from 9 to 3
+move 2 from 9 to 5
+move 5 from 5 to 2
+move 19 from 8 to 6
+move 1 from 9 to 6
+move 1 from 3 to 8
+move 4 from 2 to 6
+move 1 from 1 to 4
+move 5 from 8 to 9
+move 1 from 2 to 1
+move 6 from 7 to 2
+move 3 from 5 to 8
+move 3 from 8 to 1
+move 2 from 9 to 6
+move 1 from 7 to 8
+move 6 from 2 to 7
+move 1 from 4 to 8
+move 3 from 8 to 4
+move 2 from 1 to 5
+move 7 from 7 to 6
+move 1 from 7 to 2
+move 3 from 4 to 6
+move 2 from 9 to 2
+move 1 from 1 to 8
+move 2 from 1 to 3
+move 1 from 8 to 7
+move 3 from 2 to 5
+move 5 from 5 to 8
+move 4 from 5 to 3
+move 1 from 7 to 8
+move 2 from 8 to 1
+move 1 from 8 to 5
+move 5 from 3 to 5
+move 13 from 5 to 1
+move 1 from 3 to 4
+move 2 from 8 to 3
+move 3 from 1 to 4
+move 1 from 3 to 1
+move 1 from 8 to 1
+move 5 from 1 to 9
+move 1 from 3 to 7
+move 2 from 9 to 6
+move 2 from 1 to 7
+move 3 from 1 to 5
+move 3 from 1 to 5
+move 1 from 6 to 1
+move 4 from 4 to 3
+move 3 from 9 to 1
+move 5 from 1 to 7
+move 7 from 7 to 8
+move 1 from 3 to 9
+move 28 from 6 to 8
+move 5 from 5 to 9
+move 6 from 6 to 1
+move 4 from 1 to 8
+move 5 from 9 to 1
+move 12 from 8 to 7
+move 1 from 3 to 8
+move 6 from 1 to 4
+move 5 from 4 to 1
+move 3 from 6 to 4
+move 2 from 3 to 4
+move 3 from 1 to 5
+move 6 from 7 to 1
+move 2 from 4 to 9
+move 2 from 5 to 4
+move 19 from 8 to 1
+move 4 from 9 to 5
+move 5 from 4 to 3
+move 4 from 1 to 4
+move 5 from 5 to 1
+move 3 from 8 to 5
+move 7 from 7 to 3
+move 14 from 1 to 8
+move 5 from 4 to 2
+move 12 from 8 to 7
+move 1 from 3 to 6
+move 3 from 5 to 9
+move 1 from 7 to 8
+move 8 from 1 to 2
+move 5 from 1 to 2
+move 9 from 3 to 4
+move 8 from 4 to 6
+move 2 from 1 to 9
+move 3 from 6 to 1
+move 5 from 6 to 7
+move 14 from 7 to 1
+move 1 from 4 to 7
+move 6 from 8 to 2
+move 14 from 1 to 4
+move 13 from 4 to 9
+move 2 from 3 to 5
+move 3 from 1 to 7
+move 1 from 8 to 4
+move 1 from 4 to 1
+move 1 from 1 to 3
+move 1 from 3 to 4
+move 1 from 4 to 1
+move 1 from 6 to 9
+move 1 from 7 to 6
+move 1 from 4 to 5
+move 11 from 9 to 3
+move 6 from 3 to 8
+move 5 from 3 to 1
+move 2 from 8 to 4
+move 1 from 6 to 2
+move 7 from 9 to 2
+move 1 from 7 to 2
+move 1 from 9 to 8
+move 2 from 8 to 6
+move 30 from 2 to 3
+move 2 from 7 to 2
+move 2 from 8 to 2
+move 3 from 8 to 7
+move 6 from 2 to 5
+move 1 from 2 to 5
+move 3 from 1 to 8
+move 2 from 6 to 7
+move 1 from 1 to 9
+move 1 from 9 to 3
+move 7 from 3 to 1
+move 6 from 7 to 8
+move 8 from 3 to 9
+move 7 from 9 to 1
+move 1 from 5 to 8
+move 7 from 5 to 9
+move 2 from 4 to 2
+move 11 from 3 to 6
+move 2 from 2 to 7
+move 11 from 1 to 8
+move 2 from 5 to 4
+move 11 from 6 to 4
+move 12 from 4 to 9
+move 4 from 1 to 5
+move 3 from 7 to 9
+move 12 from 8 to 4
+move 1 from 1 to 7
+move 6 from 8 to 3
+move 2 from 3 to 5
+move 3 from 8 to 4
+move 3 from 3 to 7
+move 9 from 9 to 7
+move 5 from 3 to 9
+move 1 from 3 to 2
+move 13 from 7 to 5
+move 1 from 2 to 6
+move 1 from 6 to 1
+move 1 from 1 to 6
+move 16 from 4 to 5
+move 1 from 5 to 6
+move 16 from 5 to 4
+move 13 from 4 to 5
+move 3 from 4 to 2
+move 1 from 6 to 7
+move 3 from 2 to 1
+move 8 from 5 to 2
+move 3 from 1 to 4
+move 1 from 7 to 9
+move 14 from 5 to 1
+move 10 from 1 to 5
+move 1 from 2 to 8
+move 19 from 9 to 1
+move 1 from 9 to 1
+move 6 from 2 to 7
+move 4 from 1 to 7
+move 1 from 8 to 6
+move 16 from 5 to 3
+move 1 from 5 to 4
+move 2 from 5 to 2
+move 1 from 5 to 6
+move 1 from 6 to 5
+move 1 from 2 to 4
+move 7 from 7 to 2
+move 4 from 4 to 7
+move 2 from 6 to 2
+move 8 from 2 to 9
+move 4 from 9 to 2
+move 16 from 3 to 7
+move 4 from 9 to 7
+move 14 from 1 to 3
+move 26 from 7 to 8
+move 1 from 5 to 4
+move 20 from 8 to 4
+move 5 from 1 to 8
+move 2 from 4 to 6
+move 4 from 3 to 2
+move 1 from 6 to 5
+move 8 from 2 to 4
+move 1 from 6 to 5
+move 1 from 7 to 8
+move 8 from 3 to 1
+move 6 from 1 to 9
+move 1 from 3 to 6
+move 14 from 4 to 1
+move 1 from 3 to 8
+move 2 from 2 to 1
+move 1 from 6 to 8
+move 1 from 2 to 8
+move 5 from 8 to 1
+move 2 from 1 to 6
+move 2 from 5 to 9
+move 1 from 6 to 3
+move 1 from 6 to 1
+move 5 from 9 to 2
+move 5 from 4 to 1
+move 5 from 4 to 2
+move 16 from 1 to 8
+move 9 from 1 to 4
+move 24 from 8 to 6
+move 1 from 8 to 7
+move 7 from 6 to 5
+move 1 from 3 to 4
+move 3 from 1 to 8
+move 3 from 5 to 8
+move 10 from 4 to 8
+move 3 from 4 to 6
+move 1 from 7 to 4
+move 20 from 6 to 7
+move 1 from 4 to 9
+move 1 from 4 to 9
+move 7 from 2 to 3
+move 13 from 8 to 9
+move 4 from 5 to 9
+move 4 from 8 to 5
+move 18 from 9 to 2
+move 14 from 7 to 5
+move 6 from 3 to 8
+move 1 from 3 to 2
+move 1 from 8 to 6
+move 4 from 8 to 2
+move 1 from 2 to 3
+move 17 from 5 to 3
+move 18 from 3 to 5
+move 6 from 7 to 2
+move 3 from 9 to 7
+move 1 from 8 to 6
+move 5 from 2 to 5
+move 26 from 2 to 7
+move 1 from 6 to 9
+move 29 from 7 to 9
+move 15 from 5 to 2
+move 1 from 6 to 7
+move 8 from 9 to 2
+move 14 from 2 to 6
+move 16 from 9 to 1
+move 6 from 9 to 1
+move 1 from 7 to 1
+move 3 from 2 to 1
+move 5 from 2 to 6
+move 15 from 1 to 4
+move 1 from 2 to 8
+move 1 from 9 to 7
+move 1 from 8 to 6
+move 19 from 6 to 7
+move 10 from 1 to 8
+move 4 from 8 to 3
+move 1 from 7 to 5
+move 3 from 5 to 3
+move 13 from 7 to 6
+move 2 from 8 to 9
+move 7 from 3 to 6
+move 5 from 5 to 3
+move 1 from 1 to 6
+move 2 from 5 to 1
+move 4 from 4 to 8
+move 7 from 8 to 7
+move 8 from 7 to 3
+move 1 from 8 to 4
+move 2 from 9 to 2
+move 8 from 6 to 5
+move 1 from 4 to 5
+move 4 from 5 to 4
+move 2 from 2 to 8
+move 9 from 4 to 5
+move 2 from 1 to 9
+move 2 from 8 to 9
+move 14 from 6 to 4
+move 5 from 3 to 4
+move 3 from 9 to 7
+move 3 from 5 to 3
+move 2 from 4 to 8
+move 2 from 4 to 7
+move 2 from 8 to 9
+move 4 from 5 to 8
+move 16 from 4 to 6
+move 1 from 9 to 6
+move 3 from 7 to 5
+move 7 from 7 to 5
+move 10 from 5 to 1
+move 6 from 3 to 8
+move 2 from 9 to 3
+move 3 from 6 to 9
+move 3 from 3 to 6
+move 2 from 1 to 7
+move 13 from 6 to 2
+move 2 from 4 to 5
+move 2 from 7 to 6
+move 2 from 6 to 7
+move 2 from 4 to 1
+move 3 from 9 to 5
+move 1 from 1 to 4
+move 3 from 2 to 5
+move 2 from 4 to 1
+move 2 from 3 to 2
+move 5 from 8 to 5
+move 1 from 7 to 2
+move 1 from 7 to 1
+move 1 from 3 to 5
+move 1 from 8 to 7
+move 1 from 6 to 7
+move 1 from 3 to 5
+move 12 from 5 to 6
+move 6 from 6 to 2
+move 1 from 7 to 4
+move 1 from 5 to 7
+move 2 from 8 to 9
+move 1 from 9 to 6
+move 1 from 8 to 9
+move 5 from 6 to 9
+move 1 from 8 to 1
+move 14 from 2 to 4
+move 1 from 7 to 1
+move 1 from 7 to 2
+move 3 from 2 to 3
+move 2 from 3 to 4
+move 1 from 2 to 4
+move 4 from 6 to 2
+move 8 from 5 to 8
+move 15 from 4 to 8
+move 3 from 4 to 8
+move 7 from 8 to 4
+move 6 from 1 to 3
+move 1 from 6 to 1
+move 5 from 4 to 8
+move 7 from 9 to 1
+move 1 from 5 to 6
+move 4 from 2 to 6
+move 10 from 1 to 8
+move 29 from 8 to 3
+move 1 from 4 to 5
+move 1 from 4 to 6
+move 6 from 1 to 4
+move 1 from 5 to 8
+move 3 from 4 to 2
+move 27 from 3 to 7
+move 18 from 7 to 9
+move 5 from 6 to 3
+move 7 from 7 to 4
+move 1 from 7 to 8
+move 9 from 3 to 5
+move 5 from 3 to 6
+move 3 from 4 to 2
+move 1 from 7 to 2
+move 2 from 8 to 4
+move 2 from 8 to 6
+move 2 from 8 to 6
+move 8 from 2 to 1
+move 7 from 5 to 4
+move 1 from 8 to 9
+move 4 from 1 to 5
+move 1 from 2 to 9
+move 8 from 6 to 3
+move 3 from 1 to 8
+move 1 from 1 to 7
+move 8 from 3 to 6
+move 2 from 8 to 3
+move 1 from 3 to 6
+move 4 from 6 to 7
+move 16 from 4 to 2
+move 1 from 3 to 5
+move 2 from 6 to 4
+move 1 from 2 to 3
+move 2 from 7 to 3
+move 2 from 7 to 8
+move 3 from 6 to 7
+move 4 from 5 to 2
+move 2 from 4 to 2
+move 4 from 9 to 8
+move 3 from 5 to 1
+move 3 from 1 to 6
+move 6 from 9 to 1
+move 4 from 7 to 9
+move 8 from 9 to 5
+move 4 from 5 to 2
+move 7 from 8 to 6
+move 11 from 6 to 8
+move 4 from 1 to 2
+move 3 from 8 to 9
+move 5 from 8 to 7
+move 2 from 1 to 6
+move 4 from 5 to 6
+move 2 from 7 to 9
+move 2 from 7 to 3
+move 5 from 6 to 2
+move 4 from 3 to 1
+move 1 from 7 to 2
+move 1 from 3 to 2
+move 2 from 6 to 7
+move 1 from 1 to 6
+move 6 from 9 to 6
+move 1 from 7 to 6
+move 1 from 7 to 6
+move 2 from 1 to 7
+move 2 from 8 to 6
+move 4 from 9 to 2
+move 17 from 2 to 6
+move 1 from 9 to 4
+move 1 from 1 to 3
+move 1 from 4 to 1
+move 20 from 2 to 8
+move 2 from 7 to 6
+move 2 from 2 to 5
+move 1 from 3 to 1
+move 1 from 2 to 5
+move 6 from 8 to 6
+move 2 from 5 to 6
+move 3 from 6 to 4
+move 1 from 1 to 4
+move 15 from 8 to 2
+move 11 from 2 to 9
+move 1 from 1 to 3
+move 10 from 9 to 4
+move 1 from 9 to 8
+move 12 from 6 to 3
+move 1 from 8 to 7
+move 1 from 5 to 4
+move 8 from 4 to 7
+move 5 from 3 to 4
+move 7 from 6 to 4
+move 3 from 3 to 6
+move 3 from 3 to 2
+move 1 from 3 to 6
+move 17 from 4 to 3
+move 1 from 3 to 4
+move 2 from 4 to 9
+move 14 from 3 to 6
+move 2 from 2 to 7
+move 1 from 4 to 9
+move 8 from 7 to 6
+move 1 from 3 to 4
+move 9 from 6 to 2
+move 1 from 4 to 2
+move 26 from 6 to 2
+move 27 from 2 to 6
+move 10 from 2 to 4
+move 1 from 7 to 6
+move 28 from 6 to 2
+move 21 from 2 to 4
+move 2 from 6 to 7
+move 3 from 2 to 1
+move 5 from 6 to 5
+move 3 from 5 to 2
+move 1 from 7 to 4
+move 11 from 2 to 4
+move 21 from 4 to 9
+move 1 from 5 to 8
+move 1 from 8 to 6
+move 18 from 9 to 7
+move 1 from 5 to 7
+move 3 from 9 to 8
+move 1 from 6 to 7
+move 1 from 3 to 5
+move 1 from 8 to 3
+move 22 from 7 to 5
+move 13 from 5 to 1
+move 16 from 4 to 5
+move 3 from 1 to 4
+move 2 from 3 to 9
+move 3 from 9 to 7
+move 6 from 4 to 6
+move 1 from 4 to 2
+move 2 from 7 to 3
\ No newline at end of file
diff --git a/data/advent05a.txt b/data/advent05a.txt
new file mode 100644 (file)
index 0000000..e98aba4
--- /dev/null
@@ -0,0 +1,9 @@
+    [D]    
+[N] [C]    
+[Z] [M] [P]
+ 1   2   3 
+
+move 1 from 2 to 1
+move 3 from 1 to 3
+move 2 from 2 to 1
+move 1 from 1 to 2
\ No newline at end of file
diff --git a/problems/day05.html b/problems/day05.html
new file mode 100644 (file)
index 0000000..5019c7a
--- /dev/null
@@ -0,0 +1,203 @@
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+<meta charset="utf-8"/>
+<title>Day 5 - Advent of Code 2022</title>
+<!--[if lt IE 9]><script src="/static/html5.js"></script><![endif]-->
+<link href='//fonts.googleapis.com/css?family=Source+Code+Pro:300&subset=latin,latin-ext' rel='stylesheet' type='text/css'/>
+<link rel="stylesheet" type="text/css" href="/static/style.css?30"/>
+<link rel="stylesheet alternate" type="text/css" href="/static/highcontrast.css?0" title="High Contrast"/>
+<link rel="shortcut icon" href="/favicon.png"/>
+<script>window.addEventListener('click', function(e,s,r){if(e.target.nodeName==='CODE'&&e.detail===3){s=window.getSelection();s.removeAllRanges();r=document.createRange();r.selectNodeContents(e.target);s.addRange(r);}});</script>
+</head><!--
+
+
+
+
+Oh, hello!  Funny seeing you here.
+
+I appreciate your enthusiasm, but you aren't going to find much down here.
+There certainly aren't clues to any of the puzzles.  The best surprises don't
+even appear in the source until you unlock them for real.
+
+Please be careful with automated requests; I'm not a massive company, and I can
+only take so much traffic.  Please be considerate so that everyone gets to play.
+
+If you're curious about how Advent of Code works, it's running on some custom
+Perl code. Other than a few integrations (auth, analytics, social media), I
+built the whole thing myself, including the design, animations, prose, and all
+of the puzzles.
+
+The puzzles are most of the work; preparing a new calendar and a new set of
+puzzles each year takes all of my free time for 4-5 months. A lot of effort
+went into building this thing - I hope you're enjoying playing it as much as I
+enjoyed making it for you!
+
+If you'd like to hang out, I'm @ericwastl on Twitter.
+
+- Eric Wastl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-->
+<body>
+<header><div><h1 class="title-global"><a href="/">Advent of Code</a></h1><nav><ul><li><a href="/2022/about">[About]</a></li><li><a href="/2022/events">[Events]</a></li><li><a href="https://teespring.com/stores/advent-of-code" target="_blank">[Shop]</a></li><li><a href="/2022/settings">[Settings]</a></li><li><a href="/2022/auth/logout">[Log Out]</a></li></ul></nav><div class="user">Neil Smith <a href="/2022/support" class="supporter-badge" title="Advent of Code Supporter">(AoC++)</a> <span class="star-count">10*</span></div></div><div><h1 class="title-event">&nbsp;&nbsp;<span class="title-event-wrap">0.0.0.0:</span><a href="/2022">2022</a><span class="title-event-wrap"></span></h1><nav><ul><li><a href="/2022">[Calendar]</a></li><li><a href="/2022/support">[AoC++]</a></li><li><a href="/2022/sponsors">[Sponsors]</a></li><li><a href="/2022/leaderboard">[Leaderboard]</a></li><li><a href="/2022/stats">[Stats]</a></li></ul></nav></div></header>
+
+<div id="sidebar">
+<div id="sponsor"><div class="quiet">Our <a href="/2022/sponsors">sponsors</a> help make Advent of Code possible:</div><div class="sponsor"><a href="https://careers.king.com/" target="_blank" onclick="if(ga)ga('send','event','sponsor','sidebar',this.href);" rel="noopener">King</a> - At King, we create unforgettable games (like Candy Crush) that are loved around the world. Join us to bring moments of magic to hundreds of millions of people every single day!</div></div>
+</div><!--/sidebar-->
+
+<main>
+<article class="day-desc"><h2>--- Day 5: Supply Stacks ---</h2><p>The expedition can depart as soon as the final supplies have been unloaded from the ships. Supplies are stored in stacks of marked <em>crates</em>, but because the needed supplies are buried under many other crates, the crates need to be rearranged.</p>
+<p>The ship has a <em>giant cargo crane</em> capable of moving crates between stacks. To ensure none of the crates get crushed or fall over, the crane operator will rearrange them in a series of carefully-planned steps. After the crates are rearranged, the desired crates will be at the top of each stack.</p>
+<p>The Elves don't want to interrupt the crane operator during this delicate procedure, but they forgot to ask her <em>which</em> crate will end up where, and they want to be ready to unload them as soon as possible so they can embark.</p>
+<p>They do, however, have a drawing of the starting stacks of crates <em>and</em> the rearrangement procedure (your puzzle input). For example:</p>
+<pre><code>    [D]    
+[N] [C]    
+[Z] [M] [P]
+ 1   2   3 
+
+move 1 from 2 to 1
+move 3 from 1 to 3
+move 2 from 2 to 1
+move 1 from 1 to 2
+</code></pre>
+<p>In this example, there are three stacks of crates. Stack 1 contains two crates: crate <code>Z</code> is on the bottom, and crate <code>N</code> is on top. Stack 2 contains three crates; from bottom to top, they are crates <code>M</code>, <code>C</code>, and <code>D</code>. Finally, stack 3 contains a single crate, <code>P</code>.</p>
+<p>Then, the rearrangement procedure is given. In each step of the procedure, a quantity of crates is moved from one stack to a different stack. In the first step of the above rearrangement procedure, one crate is moved from stack 2 to stack 1, resulting in this configuration:</p>
+<pre><code>[D]        
+[N] [C]    
+[Z] [M] [P]
+ 1   2   3 
+</code></pre>
+<p>In the second step, three crates are moved from stack 1 to stack 3. Crates are moved <em>one at a time</em>, so the first crate to be moved (<code>D</code>) ends up below the second and third crates:</p>
+<pre><code>        [Z]
+        [N]
+    [C] [D]
+    [M] [P]
+ 1   2   3
+</code></pre>
+<p>Then, both crates are moved from stack 2 to stack 1. Again, because crates are moved <em>one at a time</em>, crate <code>C</code> ends up below crate <code>M</code>:</p>
+<pre><code>        [Z]
+        [N]
+[M]     [D]
+[C]     [P]
+ 1   2   3
+</code></pre>
+<p>Finally, one crate is moved from stack 1 to stack 2:</p>
+<pre><code>        [<em>Z</em>]
+        [N]
+        [D]
+[<em>C</em>] [<em>M</em>] [P]
+ 1   2   3
+</code></pre>
+<p>The Elves just need to know <em>which crate will end up on top of each stack</em>; in this example, the top crates are <code>C</code> in stack 1, <code>M</code> in stack 2, and <code>Z</code> in stack 3, so you should combine these together and give the Elves the message <code><em>CMZ</em></code>.</p>
+<p><em>After the rearrangement procedure completes, what crate ends up on top of each stack?</em></p>
+</article>
+<p>Your puzzle answer was <code>TGWSMRBPN</code>.</p><article class="day-desc"><h2 id="part2">--- Part Two ---</h2><p>As you watch the crane operator expertly rearrange the crates, you notice the process isn't following your prediction.</p>
+<p>Some mud was covering the writing on the side of the crane, and you quickly wipe it away. The crane isn't a CrateMover 9000 - it's a <em><span title="It's way better than the old CrateMover 1006.">CrateMover 9001</span></em>.</p>
+<p>The CrateMover 9001 is notable for many new and exciting features: air conditioning, leather seats, an extra cup holder, and <em>the ability to pick up and move multiple crates at once</em>.</p>
+<p>Again considering the example above, the crates begin in the same configuration:</p>
+<pre><code>    [D]    
+[N] [C]    
+[Z] [M] [P]
+ 1   2   3 
+</code></pre>
+<p>Moving a single crate from stack 2 to stack 1 behaves the same as before:</p>
+<pre><code>[D]        
+[N] [C]    
+[Z] [M] [P]
+ 1   2   3 
+</code></pre>
+<p>However, the action of moving three crates from stack 1 to stack 3 means that those three moved crates <em>stay in the same order</em>, resulting in this new configuration:</p>
+<pre><code>        [D]
+        [N]
+    [C] [Z]
+    [M] [P]
+ 1   2   3
+</code></pre>
+<p>Next, as both crates are moved from stack 2 to stack 1, they <em>retain their order</em> as well:</p>
+<pre><code>        [D]
+        [N]
+[C]     [Z]
+[M]     [P]
+ 1   2   3
+</code></pre>
+<p>Finally, a single crate is still moved from stack 1 to stack 2, but now it's crate <code>C</code> that gets moved:</p>
+<pre><code>        [<em>D</em>]
+        [N]
+        [Z]
+[<em>M</em>] [<em>C</em>] [P]
+ 1   2   3
+</code></pre>
+<p>In this example, the CrateMover 9001 has put the crates in a totally different order: <code><em>MCD</em></code>.</p>
+<p>Before the rearrangement process finishes, update your simulation so that the Elves know where they should stand to be ready to unload the final supplies. <em>After the rearrangement procedure completes, what crate ends up on top of each stack?</em></p>
+</article>
+<p>Your puzzle answer was <code>TZLTLWRNF</code>.</p><p class="day-success">Both parts of this puzzle are complete! They provide two gold stars: **</p>
+<p>At this point, you should <a href="/2022">return to your Advent calendar</a> and try another puzzle.</p>
+<p>If you still want to see it, you can <a href="5/input" target="_blank">get your puzzle input</a>.</p>
+<p>You can also <span class="share">[Share<span class="share-content">on
+  <a href="https://twitter.com/intent/tweet?text=I%27ve+completed+%22Supply+Stacks%22+%2D+Day+5+%2D+Advent+of+Code+2022&amp;url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F5&amp;related=ericwastl&amp;hashtags=AdventOfCode" target="_blank">Twitter</a>
+  <a href="javascript:void(0);" onclick="var mastodon_instance=prompt('Mastodon Instance / Server Name?'); if(typeof mastodon_instance==='string' && mastodon_instance.length){this.href='https://'+mastodon_instance+'/share?text=I%27ve+completed+%22Supply+Stacks%22+%2D+Day+5+%2D+Advent+of+Code+2022+%23AdventOfCode+https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F5'}else{return false;}" target="_blank">Mastodon</a
+></span>]</span> this puzzle.</p>
+</main>
+
+<!-- ga -->
+<script>
+(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+ga('create', 'UA-69522494-1', 'auto');
+ga('set', 'anonymizeIp', true);
+ga('send', 'pageview');
+</script>
+<!-- /ga -->
+</body>
+</html>
\ No newline at end of file