-- number of steps
type Distance = Int
+
+-- easting, northing
type Position = (Int, Int)
-- the directions. See below for functions for turning
data Direction = North | East | South | West
deriving (Enum, Show, Bounded, Eq)
--- direction, easting, northing
+-- The currenct state of a Mowmaster
data Mowmaster = Mowmaster { direction :: Direction
, position :: Position
} deriving (Show, Eq)
data Instruction = Forward Distance
| Clockwise
| Anticlockwise
- | Comment String
deriving (Show, Eq)
part1 = length
part2 :: [Instruction] -> Int
-part2 instructions = finalDistance $ executeAll instructions
+part2 = finalDistance . executeAll
where executeAll = foldl' execute initialMowmaster
-initialMowmaster = Mowmaster North (0, 0)
+initialMowmaster = Mowmaster East (0, 0)
-- Calculate manhattan distance from start to this state
execute m (Forward s) = m {position = forward s (direction m) (position m)}
execute m Clockwise = m {direction = turnCW (direction m)}
execute m Anticlockwise = m {direction = turnACW (direction m)}
-execute m _ = m
-- Move in the current direction
-forward :: Int -> Direction -> Position -> Position
+forward :: Distance -> Direction -> Position -> Position
forward s North (e, n) = (e, n+s)
forward s South (e, n) = (e, n-s)
forward s West (e, n) = (e-s, n)
-- instructions is some optional space followed by many instructions
instrsP = optional sc *> many instrP
+
+-- an instruction is either F, C, or A
instrP = forwardP <|> cwP <|> acwP
-- parse each instruction