import Linear.V2 import Data.List import Control.Lens type Rope = (V2 Int,V2 Int) main :: IO () main = do input <- concat <$> map (parse . words) <$> lines <$> readFile "input" print $ length $ nub $ sort $ snd $ moveAll ((V2 0 0,V2 0 0),[]) input parse :: [String] -> [V2 Int] parse (dir:len:[]) | dir == "R" = f $ V2 1 0 | dir == "L" = f $ V2 (-1) 0 | dir == "U" = f $ V2 0 1 | dir == "D" = f $ V2 0 (-1) where f = take (read len) . repeat moveAll :: (Rope,[V2 Int]) -> [V2 Int] -> (Rope,[V2 Int]) moveAll r (x:xs) = moveAll (move r x) xs moveAll ((head,tail),xs) _ = ((head,tail),tail:xs) move :: (Rope,[V2 Int]) -> V2 Int -> (Rope,[V2 Int]) move ((head,tail),ps) m = ((head+m,newTail),tail:ps) where newTail = tailMove (head + m - tail) + tail tailMove (V2 a b) = V2 (f a) (f b) where f x | abs a == abs b = 0 | abs a + abs b == 1 = 0 | otherwise = if abs x >= 2 then x `div` 2 else x