Optimised day 19
[advent-of-code-22.git] / advent09 / Main.hs
index 1e23f78ead14ea5a81a5e708cb1c7dcffc2d4c62..4273e24d61deb1003d8a2dc88078432ec5d93d4e 100644 (file)
@@ -33,12 +33,12 @@ main =
       print $ part1 steps
       print $ part2 steps
 
-part1 :: Path -> Int
-part1 steps = S.size $ rope' ^. trace
-  where rope' = ropeSteps (newRope 1) steps
+part1, part2 :: Path -> Int
+part1 steps = S.size $ rope ^. trace
+  where rope = ropeSteps (newRope 1) steps
 
-part2 steps = S.size $ rope' ^. trace
-  where rope' = ropeSteps (newRope 9) steps
+part2 steps = S.size $ rope ^. trace
+  where rope = ropeSteps (newRope 9) steps
 
 
 expandPath :: [Direction] -> Path
@@ -48,13 +48,12 @@ expandPath = concatMap expandStep
         expandStep (D n) = replicate n (V2  0 -1)
         expandStep (R n) = replicate n (V2  1  0)
 
-
-manhattan :: Position -> Position -> Int
-manhattan p1 p2 = max dx dy
+lInfNorm :: Position -> Position -> Int
+lInfNorm p1 p2 = max dx dy
   where V2 dx dy = abs $ p1 ^-^ p2
 
 touching :: Position -> Position -> Bool
-touching p1 p2 =  (manhattan p1 p2) <= 1
+touching p1 p2 = (lInfNorm p1 p2) <= 1
 
 towards :: Position -> Position -> Position
 towards p1 p2 = signum $ p2 ^-^ p1
@@ -67,21 +66,17 @@ ropeSteps rope steps = foldl' ropeStep rope steps
 
 ropeStep :: Rope -> Position -> Rope
 ropeStep rope step = rope & headK .~ h
-                          & knots .~ (reverse kts')
-                          & trace %~ S.insert (head kts')
+                          & knots .~ (reverse kts)
+                          & trace %~ S.insert kt
   where h = (rope ^. headK) ^+^ step
-        kts = rope ^. knots
-        (_, kts') = foldl' knotStep (h, []) kts
-
-
--- foldl' (f) (hr, []) knots
+        (kt, kts) = foldl' knotStep (h, []) $ rope ^. knots -- kts
 
+knotStep :: (Position, [Position]) -> Position -> (Position, [Position])
 knotStep (h, ks) kt = (kt', (kt':ks)) 
   where kt' = if kt `touching` h
               then kt
               else kt ^+^ (kt `towards` h)
 
-
 -- Parse the input file
 
 pathP :: Parser [Direction]