Done task 6 in Python
[summerofcode2018soln.git] / src / task1 / task1-mpc.hs
index a8a3ccbba0e00b22dafa6129764285c140e14a68..27b279a1718dba287650b8f56cd979fd56b04c02 100644 (file)
@@ -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