X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=src%2Ftask1%2Ftask1-mpc.hs;h=27b279a1718dba287650b8f56cd979fd56b04c02;hb=857d929fb4bca42e231de9ad7fb2243bd27a2670;hp=a8a3ccbba0e00b22dafa6129764285c140e14a68;hpb=c3a235494fa4e2aca91cadf94b3c5890baa7734e;p=summerofcode2018soln.git diff --git a/src/task1/task1-mpc.hs b/src/task1/task1-mpc.hs index a8a3ccb..27b279a 100644 --- a/src/task1/task1-mpc.hs +++ b/src/task1/task1-mpc.hs @@ -16,13 +16,15 @@ import qualified Control.Applicative as CA -- 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) @@ -31,7 +33,6 @@ data Mowmaster = Mowmaster { direction :: Direction data Instruction = Forward Distance | Clockwise | Anticlockwise - | Comment String deriving (Show, Eq) @@ -46,10 +47,10 @@ part1 :: [Instruction] -> Int 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 @@ -63,10 +64,9 @@ execute :: Mowmaster -> Instruction -> Mowmaster 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) @@ -99,6 +99,8 @@ symb = L.symbol sc -- 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