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
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
where V2 dx dy = abs $ p1 ^-^ p2
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]