diff --git a/09/Main.idr b/09/Main.idr new file mode 100644 index 0000000..cc992c2 --- /dev/null +++ b/09/Main.idr @@ -0,0 +1,159 @@ +import Data.String +import Data.Vect +import Data.List1 +import System.File.ReadWrite + +%default total + +data Direction = Up | Right | Left | Down +%name Direction direction, direction2, direction3 + +Show Direction where + show Up = "Up" + show Right = "Right" + show Left = "Left" + show Down = "Down" + +parseDirection : String -> Maybe Direction +parseDirection input = + case trim input of + "U" => Just Up + "R" => Just Right + "L" => Just Left + "D" => Just Down + x => Nothing + +invert : Direction -> Direction +invert Up = Down +invert Right = Left +invert Left = Right +invert Down = Up + +-- Apply a direction to a pair of Ints +applyDirection : Direction -> (Int, Int) -> (Int, Int) +applyDirection Up (x, y) = (x, y + 1) +applyDirection Right (x, y) = (x + 1, y) +applyDirection Left (x, y) = (x - 1, y) +applyDirection Down (x, y) = (x, y - 1) + +data Motion = Move Direction Nat +%name Motion motion, motion2, motion3 + +Show Motion where + show (Move direction count) = show direction ++ " " ++ show count + +parseMotion : String -> Maybe Motion +parseMotion input = + let components = split (== ' ') input in + case forget components of + [x, y] => do direction <- parseDirection x + ammount <- parsePositive y + pure (Move direction ammount) + _ => Nothing + +parseMotions : String -> Maybe (List Motion) +parseMotions input = + let inputLines = lines input + in traverse parseMotion inputLines + +-- Get the distance moved by a motion +distance : Motion -> Nat +distance (Move _ i) = i + +-- Break a motion down into a list of moves-by-one +breakdown : (motion : Motion) -> Vect (distance motion) Direction +breakdown (Move direction 0) = [] +breakdown input@(Move direction (S k)) = direction :: breakdown (assert_smaller input (Move direction k)) + +-- The state of a head and tail +data State: Type where + MkState : (head : (Int, Int)) -> (tail : (Int, Int)) -> State +%name State state, state1, state2 + +Show State where + show (MkState head tail) = "Head: " ++ show head ++ " Tail: " ++ show tail + +emptyState : State +emptyState = MkState (0,0) (0,0) + +tail : State -> (Int, Int) +tail (MkState head x) = x + +touching : (Int, Int) -> (Int, Int) -> Bool +touching (x, y) (z, w) = + let (u, v) = (abs (x - z), abs (y - w)) in + u <= 1 && v <= 1 + +-- Move the head in a particular direction, causing the tail to follow if needed +moveHead : Direction -> State -> State +moveHead direction (MkState head tail) = + let newHead = applyDirection direction head in + if touching newHead tail + then MkState newHead tail + else let newTail = applyDirection (invert direction) newHead in + MkState newHead newTail + +-- Apply a movement to the head, returning the sequence of tail positions, including the starting +-- position +applyMotion : (motion : Motion) -> State -> (State, Vect (S (distance motion)) State) +applyMotion motion state = helper (breakdown motion) state + where helper : (directions : Vect n Direction) -> State -> (State, Vect (S n) State) + helper [] state = (state, [state]) + helper (x :: xs) state = + let newState = moveHead x state + (resState, rest) = helper xs newState + in (resState, state :: rest) + +-- Apply all the motions in a list to the head, returning the full sequence of positions +applyMotions : (motions : List Motion) -> State -> (State, List State) +applyMotions [] state = (state, [state]) +applyMotions (x :: xs) state = + let (newState, motions) = applyMotion x state + (outputState, rest) = applyMotions xs newState + in (outputState, (toList motions) ++ rest) + +simple = """ + R 4 + U 4 + L 3 + D 1 + R 4 + D 1 + L 5 + R 2 + """ + +testPart1 : IO () +testPart1 = + case parseMotions simple of + Nothing => putStrLn "Failed to parse motions" + Just motions => + let (state, states) = applyMotions motions emptyState + tails = map tail states + uniqueTails = nub tails + in do putStrLn "Movements:" + traverse_ printLn motions + putStrLn "\nSteps:" + traverse_ printLn states + putStrLn "\nUnique Tails:" + printLn $ length uniqueTails + +part1 : String -> Maybe Nat +part1 input = + case parseMotions input of + Nothing => Nothing + Just motions => + let (state, states) = applyMotions motions emptyState + tails = map tail states + in Just . length . nub $ tails + +partial main : IO () +main = + do file <- readFile "input" + case file of + Left err => printLn err + Right contents => + case part1 contents of + Nothing => printLn "Error in part 1" + Just part1Count => + putStrLn ("Part 1: " ++ show part1Count) diff --git a/09/input b/09/input new file mode 100644 index 0000000..b6c2ce5 --- /dev/null +++ b/09/input @@ -0,0 +1,2000 @@ +U 2 +D 2 +R 1 +D 2 +R 2 +D 2 +R 2 +D 1 +L 2 +U 2 +L 2 +R 1 +L 1 +U 1 +L 2 +D 1 +R 2 +D 1 +U 2 +R 2 +D 2 +U 2 +R 2 +L 1 +D 2 +R 2 +U 2 +R 1 +L 1 +U 2 +R 1 +U 2 +L 1 +R 2 +L 1 +R 1 +U 2 +L 2 +R 1 +D 2 +U 1 +R 1 +L 1 +U 2 +D 2 +U 2 +R 1 +D 1 +L 2 +U 1 +R 2 +L 2 +D 1 +U 2 +D 2 +R 2 +D 2 +R 2 +D 1 +R 1 +D 1 +U 2 +L 1 +R 2 +D 2 +L 2 +R 1 +L 2 +R 1 +D 1 +R 2 +D 2 +U 2 +L 2 +U 2 +R 1 +L 1 +D 2 +U 1 +D 2 +L 2 +D 1 +U 2 +R 1 +D 2 +L 2 +U 2 +D 2 +R 2 +L 1 +R 2 +L 1 +U 2 +L 2 +U 2 +R 1 +D 2 +U 1 +D 2 +R 2 +U 2 +D 1 +U 1 +L 1 +R 1 +U 2 +R 2 +D 1 +R 2 +L 1 +U 2 +L 2 +R 1 +D 1 +R 2 +U 3 +R 2 +D 1 +L 1 +U 2 +D 1 +U 2 +D 3 +U 2 +R 3 +L 3 +R 2 +L 1 +U 2 +L 2 +U 2 +D 1 +R 3 +U 2 +L 3 +R 3 +L 3 +D 3 +L 3 +U 3 +D 3 +L 3 +R 3 +D 1 +L 2 +D 1 +L 2 +D 1 +R 3 +L 3 +D 2 +R 3 +D 3 +R 2 +U 3 +R 3 +D 1 +U 2 +R 1 +D 2 +L 3 +U 3 +D 3 +R 2 +L 1 +D 2 +L 3 +R 2 +D 2 +L 3 +D 1 +R 2 +L 1 +R 3 +D 3 +U 3 +L 1 +D 2 +R 2 +U 1 +L 3 +R 1 +D 1 +U 3 +L 2 +D 1 +R 1 +D 2 +R 2 +U 2 +L 3 +U 1 +R 2 +U 3 +L 2 +U 1 +L 3 +R 3 +L 1 +R 1 +L 1 +U 2 +L 2 +D 2 +R 2 +D 1 +R 3 +L 3 +R 2 +D 3 +R 3 +L 3 +D 2 +U 2 +L 3 +U 3 +R 2 +D 1 +R 1 +L 1 +D 1 +U 1 +L 2 +D 3 +U 3 +D 1 +U 2 +D 2 +L 1 +R 2 +U 3 +D 2 +R 4 +D 1 +U 1 +R 3 +D 3 +U 1 +D 3 +U 1 +L 3 +R 4 +L 3 +U 2 +D 1 +L 4 +D 3 +R 3 +D 4 +U 2 +D 3 +L 3 +D 2 +R 2 +U 3 +D 4 +L 4 +D 4 +U 1 +L 3 +U 2 +L 4 +R 2 +L 3 +D 4 +L 4 +D 4 +L 1 +U 1 +D 1 +L 3 +U 2 +L 1 +R 1 +D 3 +R 3 +L 1 +U 2 +L 1 +U 3 +R 2 +L 3 +R 3 +U 1 +L 1 +R 3 +D 2 +U 1 +D 1 +U 1 +L 1 +R 3 +L 2 +U 2 +R 2 +U 3 +R 2 +U 2 +D 3 +R 1 +L 4 +R 2 +L 4 +U 1 +L 2 +R 2 +L 2 +U 4 +R 3 +U 3 +L 2 +U 3 +R 1 +L 4 +D 3 +R 4 +U 2 +L 2 +R 2 +D 2 +R 1 +U 1 +L 4 +R 2 +U 3 +R 2 +U 4 +L 3 +R 4 +D 1 +R 4 +L 2 +U 2 +R 5 +U 2 +D 2 +R 1 +U 1 +R 5 +L 2 +U 3 +D 1 +R 1 +L 3 +R 4 +L 1 +D 5 +R 1 +U 5 +L 4 +U 5 +D 1 +L 4 +R 3 +U 1 +R 1 +L 4 +R 5 +D 4 +R 1 +U 2 +R 5 +L 4 +R 1 +L 5 +D 4 +U 3 +R 1 +U 1 +R 1 +D 4 +U 3 +L 2 +R 1 +D 2 +L 4 +R 4 +L 1 +U 5 +D 3 +R 5 +D 1 +L 5 +R 3 +L 1 +R 2 +U 5 +D 4 +U 5 +L 5 +R 5 +U 5 +L 3 +D 3 +L 5 +U 1 +D 2 +L 2 +R 3 +D 3 +R 2 +U 1 +D 4 +L 4 +D 5 +L 1 +R 1 +U 5 +R 2 +U 2 +L 1 +U 4 +D 5 +R 1 +L 4 +D 1 +L 1 +U 3 +D 1 +R 2 +L 3 +D 4 +R 2 +L 4 +D 5 +U 3 +L 3 +U 4 +R 5 +L 3 +R 1 +U 3 +R 4 +D 4 +R 2 +D 3 +R 2 +U 1 +L 3 +U 1 +D 5 +L 1 +D 3 +L 4 +R 3 +D 6 +R 2 +D 5 +U 3 +L 2 +R 1 +D 6 +R 5 +L 5 +R 5 +L 3 +U 2 +R 1 +U 3 +R 6 +U 5 +D 1 +L 1 +U 3 +L 4 +U 5 +R 1 +L 2 +R 1 +U 2 +D 2 +L 4 +R 3 +D 3 +L 3 +D 6 +U 2 +L 3 +R 5 +U 4 +L 2 +R 2 +L 5 +D 5 +L 4 +D 4 +R 1 +L 5 +U 1 +L 6 +D 3 +R 6 +L 1 +R 6 +U 5 +R 4 +L 5 +D 5 +R 5 +U 6 +D 4 +U 6 +L 4 +U 4 +L 4 +R 1 +U 2 +R 2 +D 2 +L 5 +D 1 +R 5 +U 2 +D 1 +U 3 +D 4 +U 2 +R 6 +L 2 +R 3 +L 2 +D 1 +U 4 +L 1 +D 1 +U 2 +R 3 +L 4 +D 2 +R 6 +L 5 +U 5 +D 2 +L 3 +U 2 +R 3 +U 6 +R 5 +L 4 +R 1 +L 4 +U 5 +R 3 +U 4 +L 2 +U 5 +R 3 +U 3 +R 2 +U 2 +D 5 +U 4 +D 1 +R 6 +D 5 +L 2 +D 6 +U 2 +L 5 +R 7 +L 5 +U 5 +R 4 +U 4 +R 5 +U 7 +L 5 +U 5 +D 1 +U 2 +R 5 +D 4 +U 7 +R 7 +L 2 +U 4 +D 1 +U 4 +D 6 +U 5 +D 4 +L 6 +D 2 +L 5 +U 6 +D 3 +U 1 +R 6 +D 4 +U 7 +L 2 +R 4 +U 1 +D 6 +R 6 +D 7 +R 3 +U 5 +L 5 +U 2 +D 1 +L 1 +D 4 +L 5 +R 4 +U 6 +R 4 +D 2 +R 6 +D 5 +R 5 +L 6 +R 5 +D 6 +U 3 +D 6 +R 7 +D 6 +U 2 +R 4 +U 4 +L 1 +R 1 +L 6 +D 6 +R 6 +D 1 +U 2 +L 5 +D 2 +R 2 +L 1 +U 3 +R 1 +L 5 +D 7 +U 4 +L 5 +D 4 +R 7 +D 2 +L 7 +R 5 +L 2 +R 7 +D 6 +R 6 +U 1 +D 2 +U 3 +R 2 +L 4 +R 4 +D 6 +U 6 +L 3 +R 1 +U 3 +L 4 +D 6 +U 5 +D 2 +R 3 +D 4 +L 5 +D 5 +R 1 +D 2 +L 4 +U 2 +D 1 +L 7 +D 8 +L 8 +R 5 +U 2 +L 3 +R 1 +U 7 +L 8 +R 8 +D 4 +R 7 +U 7 +L 7 +U 1 +L 2 +D 4 +U 6 +R 8 +D 4 +L 5 +R 2 +D 8 +L 5 +D 1 +U 2 +R 5 +U 5 +R 1 +U 7 +D 1 +R 4 +D 8 +R 3 +L 2 +U 1 +L 5 +R 5 +U 6 +L 2 +U 3 +L 8 +U 8 +D 3 +U 4 +R 6 +U 3 +D 3 +L 4 +U 8 +R 7 +U 7 +R 8 +D 7 +L 6 +R 6 +D 7 +U 3 +D 1 +L 1 +U 7 +L 6 +U 3 +D 1 +U 7 +L 8 +R 5 +U 5 +L 6 +R 2 +D 7 +L 6 +D 3 +R 6 +D 5 +R 6 +L 4 +U 1 +L 2 +D 6 +R 5 +U 1 +D 5 +L 6 +D 8 +R 3 +D 7 +R 5 +D 8 +U 6 +D 2 +L 1 +U 4 +D 8 +U 1 +D 6 +L 2 +R 5 +U 3 +L 4 +U 2 +R 6 +U 6 +R 1 +D 8 +L 2 +U 5 +R 9 +D 5 +L 8 +D 5 +R 7 +D 2 +U 1 +R 4 +L 1 +D 9 +R 4 +U 5 +D 2 +U 7 +R 9 +D 9 +L 8 +U 1 +R 3 +L 5 +R 5 +D 4 +R 3 +D 3 +R 2 +U 3 +D 5 +L 8 +R 3 +U 8 +D 9 +U 1 +R 8 +D 6 +U 2 +L 6 +R 7 +L 1 +R 2 +L 4 +U 7 +R 8 +D 3 +R 4 +D 5 +L 4 +R 1 +D 4 +R 8 +U 1 +L 4 +R 8 +L 3 +U 3 +L 3 +U 7 +R 5 +U 5 +R 3 +U 3 +L 5 +R 8 +U 7 +L 9 +U 9 +D 8 +R 7 +L 2 +R 1 +D 9 +L 8 +D 6 +U 7 +R 6 +L 2 +U 7 +L 6 +R 4 +L 7 +R 3 +U 1 +L 2 +U 1 +D 8 +R 9 +D 3 +U 2 +L 5 +R 3 +D 5 +L 8 +U 1 +D 1 +L 6 +U 2 +R 4 +D 4 +R 2 +U 6 +L 4 +R 7 +D 8 +L 3 +D 5 +R 4 +D 7 +R 2 +U 9 +L 4 +R 4 +U 8 +L 9 +R 6 +D 3 +R 8 +D 1 +U 9 +R 7 +U 3 +L 2 +U 10 +D 7 +L 10 +R 7 +D 6 +U 9 +R 4 +D 8 +R 8 +L 4 +U 7 +L 9 +R 7 +U 6 +R 1 +L 1 +D 9 +L 4 +U 8 +L 9 +R 3 +L 1 +D 3 +L 7 +D 2 +U 7 +R 10 +L 7 +D 3 +R 5 +L 9 +D 1 +L 4 +R 1 +D 10 +U 10 +D 1 +L 1 +R 1 +D 8 +U 3 +R 4 +L 5 +U 6 +L 8 +U 9 +L 7 +D 10 +U 7 +L 3 +R 4 +D 7 +L 4 +D 1 +L 8 +R 6 +L 3 +R 5 +L 3 +R 2 +U 4 +L 5 +U 8 +R 9 +U 1 +R 7 +U 5 +L 5 +U 6 +L 4 +D 9 +L 6 +D 8 +U 10 +L 1 +D 8 +R 4 +L 6 +D 6 +U 5 +L 9 +D 6 +U 10 +L 5 +D 5 +R 5 +U 6 +L 4 +R 7 +L 2 +R 5 +L 1 +D 2 +R 3 +U 10 +L 5 +D 6 +U 7 +D 6 +L 4 +R 8 +D 1 +L 6 +U 2 +R 7 +L 3 +U 10 +D 11 +L 1 +D 7 +R 1 +U 8 +D 4 +R 3 +U 6 +D 5 +R 3 +D 9 +L 6 +D 5 +U 4 +R 2 +U 4 +D 9 +U 2 +L 2 +R 2 +D 8 +R 8 +L 3 +D 8 +R 9 +U 1 +D 11 +L 6 +U 3 +L 11 +D 5 +U 6 +D 5 +L 9 +U 11 +L 1 +D 1 +U 7 +D 2 +U 11 +L 10 +U 2 +R 1 +L 4 +D 2 +U 10 +D 2 +R 7 +L 2 +R 10 +U 10 +R 6 +L 7 +U 10 +D 10 +R 8 +U 3 +L 5 +D 10 +L 3 +D 4 +U 5 +L 8 +U 5 +D 10 +L 5 +D 9 +U 7 +L 3 +U 3 +L 6 +U 5 +R 11 +D 1 +U 5 +R 11 +D 5 +U 4 +D 1 +L 4 +D 6 +L 10 +R 8 +D 8 +R 3 +U 4 +D 1 +R 8 +U 9 +D 4 +R 1 +L 6 +D 9 +R 1 +L 2 +R 6 +D 8 +U 3 +R 6 +U 9 +R 2 +L 10 +U 10 +D 2 +L 5 +U 10 +R 4 +U 1 +R 2 +U 6 +D 8 +L 9 +D 5 +L 7 +D 12 +L 10 +R 9 +L 10 +U 3 +L 11 +R 5 +L 5 +D 12 +L 12 +R 11 +U 6 +R 10 +U 12 +L 11 +U 9 +L 12 +R 8 +D 2 +L 2 +U 11 +D 10 +L 9 +U 6 +L 3 +R 1 +D 4 +U 12 +L 6 +R 8 +U 3 +R 6 +L 10 +R 7 +U 4 +R 1 +U 1 +R 2 +L 3 +U 1 +D 1 +R 3 +D 7 +R 12 +D 1 +U 9 +R 2 +D 1 +U 1 +D 1 +L 3 +D 10 +L 8 +D 8 +U 12 +L 10 +R 3 +L 3 +D 2 +U 1 +R 10 +D 11 +U 9 +L 3 +U 5 +L 10 +R 9 +D 9 +L 12 +R 12 +D 9 +R 4 +D 2 +L 12 +U 9 +D 4 +U 9 +R 3 +L 9 +U 6 +L 6 +D 9 +U 6 +R 1 +U 4 +R 1 +L 7 +D 5 +U 7 +L 3 +R 1 +U 9 +R 7 +U 8 +R 3 +L 2 +D 12 +R 11 +D 2 +R 7 +U 7 +L 12 +R 9 +D 8 +U 7 +L 1 +D 1 +R 9 +L 2 +U 13 +R 7 +D 4 +U 3 +D 1 +L 4 +U 7 +L 5 +R 2 +U 8 +L 6 +R 13 +U 7 +D 10 +R 5 +U 5 +D 3 +R 13 +L 5 +R 1 +U 13 +D 3 +R 12 +U 10 +L 3 +R 12 +L 9 +U 7 +D 2 +L 7 +R 11 +D 3 +L 4 +D 11 +R 1 +L 9 +R 5 +D 1 +R 10 +L 2 +R 4 +D 8 +R 10 +D 9 +U 4 +D 5 +L 1 +D 7 +R 12 +D 13 +U 8 +R 4 +D 5 +L 9 +D 8 +U 3 +L 7 +D 8 +L 9 +R 11 +L 13 +R 8 +D 6 +L 13 +R 10 +D 7 +L 10 +R 8 +L 4 +U 6 +L 2 +R 5 +L 13 +U 2 +R 6 +U 8 +L 6 +D 7 +R 2 +U 2 +R 3 +U 9 +L 6 +U 1 +R 8 +D 13 +R 9 +L 10 +U 5 +L 9 +D 10 +R 3 +L 8 +R 1 +L 1 +D 1 +L 3 +R 5 +L 3 +R 10 +L 4 +U 7 +R 8 +D 2 +R 2 +D 2 +U 8 +R 12 +L 9 +D 12 +R 5 +L 4 +R 10 +D 2 +L 1 +D 6 +L 14 +U 13 +R 1 +U 13 +R 3 +U 9 +D 8 +U 13 +L 6 +R 7 +D 13 +U 7 +D 10 +U 1 +R 9 +U 3 +L 12 +R 7 +U 9 +D 13 +U 13 +L 8 +U 12 +D 14 +L 3 +D 5 +L 12 +U 12 +L 12 +D 4 +U 3 +L 2 +R 10 +U 10 +D 4 +L 5 +R 10 +U 13 +D 1 +U 7 +D 11 +U 11 +D 11 +L 7 +R 3 +L 10 +U 10 +R 10 +D 7 +R 9 +U 14 +R 7 +U 4 +R 4 +L 2 +D 9 +R 9 +D 4 +U 10 +D 3 +U 10 +L 5 +R 2 +L 3 +U 8 +R 1 +D 4 +L 6 +D 5 +R 14 +U 2 +D 14 +U 3 +D 2 +R 4 +U 2 +D 11 +U 6 +D 1 +U 13 +D 5 +L 14 +U 10 +L 12 +D 2 +R 12 +D 5 +R 1 +D 2 +U 5 +R 13 +U 2 +R 5 +U 10 +R 8 +U 11 +D 7 +U 13 +L 8 +U 13 +D 15 +L 3 +D 2 +U 9 +R 4 +U 11 +L 5 +R 6 +D 13 +L 13 +D 14 +R 8 +D 1 +L 10 +R 11 +L 7 +D 11 +R 9 +L 15 +D 7 +U 12 +D 7 +L 6 +U 15 +R 9 +U 2 +D 13 +R 5 +D 13 +R 9 +D 14 +R 1 +L 13 +U 7 +L 6 +D 8 +L 6 +D 5 +R 9 +U 12 +R 13 +D 13 +L 3 +U 4 +L 15 +D 7 +R 1 +L 5 +U 11 +D 6 +L 1 +U 12 +D 12 +U 14 +L 15 +R 14 +D 11 +U 9 +D 6 +L 3 +D 10 +R 6 +D 14 +R 10 +L 12 +D 9 +U 3 +D 15 +L 10 +D 1 +L 12 +R 12 +U 2 +D 8 +L 7 +D 4 +L 9 +U 5 +D 8 +L 8 +U 15 +L 1 +U 11 +L 1 +R 7 +L 9 +U 4 +D 8 +R 8 +L 15 +D 3 +R 5 +U 9 +L 14 +R 15 +L 7 +R 1 +L 1 +R 11 +D 13 +U 3 +L 7 +R 3 +L 3 +U 7 +R 7 +D 8 +R 5 +L 9 +R 2 +L 9 +R 11 +U 3 +L 10 +D 2 +L 14 +D 6 +U 10 +D 2 +U 15 +R 9 +L 7 +D 9 +L 14 +D 4 +R 3 +L 5 +D 13 +R 4 +L 10 +R 7 +L 12 +R 3 +D 14 +R 4 +L 13 +U 9 +D 15 +U 9 +D 7 +L 15 +D 1 +U 10 +D 1 +L 7 +R 9 +D 13 +L 11 +R 2 +D 7 +L 12 +R 1 +L 10 +D 7 +L 14 +U 8 +L 15 +R 15 +L 12 +R 14 +D 5 +R 9 +D 4 +L 15 +U 14 +L 12 +R 11 +D 9 +U 12 +L 11 +U 2 +D 10 +L 1 +D 11 +L 9 +R 2 +D 4 +R 7 +U 12 +L 14 +R 9 +L 15 +R 6 +L 1 +D 4 +R 14 +D 10 +L 12 +U 8 +L 15 +U 7 +L 4 +D 3 +L 14 +U 6 +L 6 +R 13 +D 12 +R 14 +D 14 +L 8 +D 3 +R 12 +L 4 +U 16 +R 7 +U 2 +D 12 +R 3 +D 15 +R 14 +D 8 +U 14 +D 7 +U 14 +D 8 +U 8 +R 1 +D 9 +L 5 +U 2 +L 11 +U 5 +L 14 +U 2 +D 7 +R 17 +U 5 +R 9 +D 8 +U 1 +R 1 +U 11 +L 5 +R 10 +U 16 +R 16 +L 5 +R 7 +U 6 +D 12 +L 16 +U 2 +D 4 +L 13 +R 9 +D 12 +R 11 +U 14 +D 16 +R 6 +D 2 +L 6 +D 5 +R 17 +D 17 +R 2 +U 10 +R 7 +L 12 +U 9 +R 5 +D 4 +R 17 +L 10 +U 13 +D 1 +U 3 +D 4 +L 6 +D 6 +L 9 +U 16 +L 6 +D 2 +U 10 +L 7 +D 6 +R 15 +D 15 +L 12 +D 1 +U 6 +R 3 +U 11 +R 8 +U 13 +D 14 +L 13 +R 9 +L 3 +U 4 +D 12 +U 11 +R 15 +L 3 +D 13 +L 5 +R 17 +D 12 +L 16 +U 6 +R 15 +D 6 +R 13 +D 13 +R 8 +D 7 +U 6 +D 11 +R 17 +U 15 +R 15 +L 1 +D 7 +U 12 +R 15 +L 17 +R 6 +U 1 +R 17 +L 5 +U 1 +L 14 +R 14 +L 5 +D 5 +R 2 +L 7 +U 7 +D 8 +L 17 +U 1 +R 16 +U 9 +L 13 +U 12 +R 2 +U 16 +D 8 +U 17 +L 10 +R 5 +U 11 +D 17 +L 15 +R 11 +U 7 +R 9 +L 4 +D 17 +L 2 +R 7 +D 17 +L 7 +U 12 +L 3 +U 13 +D 2 +L 8 +R 3 +D 17 +U 1 +R 17 +L 2 +U 17 +R 10 +U 1 +R 14 +U 8 +L 17 +D 3 +L 13 +D 10 +R 1 +L 11 +U 10 +L 14 +D 15 +R 14 +L 9 +U 1 +R 11 +L 13 +U 12 +L 9 +U 14 +L 12 +U 11 +L 6 +R 4 +D 2 +L 14 +R 13 +U 16 +L 2 +R 11 +D 18 +R 13 +U 3 +D 15 +L 3 +R 12 +U 10 +L 5 +R 3 +L 11 +U 14 +L 15 +R 3 +L 7 +D 5 +U 1 +R 6 +U 14 +D 17 +U 2 +D 15 +U 14 +D 1 +L 7 +D 1 +R 13 +L 9 +U 5 +L 2 +D 14 +U 14 +R 4 +U 14 +R 11 +U 8 +L 9 +D 15 +L 13 +U 17 +L 2 +U 1 +R 11 +U 7 +D 3 +U 8 +L 16 +D 3 +R 11 +L 17 +D 15 +R 16 +U 18 +D 8 +L 4 +U 2 +D 6 +R 15 +D 11 +L 12 +R 9 +D 18 +R 5 +D 1 +R 12 +L 5 +R 6 +L 6 +U 2 +L 15 +R 6 +L 16 +D 17 +U 11 +R 13 +L 10 +D 7 +L 15 +D 19 +R 17 +U 1 +R 19 +L 16 +U 18 +R 5 +L 6 +D 19 +L 1 +R 15 +L 16 +U 17 +D 18 +U 14 +L 19 +R 18 +L 12 +U 10 +D 2 +L 7 +R 1 +U 15 +L 1 +R 14 +U 10 +D 15 +U 4 +L 1 +U 11 +D 12 +U 7 +D 14 +R 14 +D 12 +L 17 +D 3 +R 6 +D 3 +R 4 +L 2 +R 5 +D 3 +L 10 +U 12 +L 12 +R 7 +D 12 +L 10 +R 10 +D 8 +L 13 +R 9 +U 18 +L 14 +R 1 +L 7 +D 18 +L 14 +U 11 +D 8 +R 13 +D 2 +R 10 +L 4 +R 1 +D 7 +U 18 +D 9 +L 5 +D 2 +U 2 +L 11 +R 2 +D 11 +L 13 +D 17 +L 7 +R 9 +L 9 +R 4 +D 7