Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  1. import Data.List
  2. import System.Environment (getArgs)
  3.  
  4. manhattanDistance :: (Int, Int) -> (Int, Int) -> Int
  5. manhattanDistance coordinateA coordinateB = abs (fst coordinateA - fst coordinateB) + abs (snd coordinateA - snd coordinateB)
  6.  
  7. interpolate' :: Int -> Int -> Double -> Int
  8. interpolate' start goal t = round $ (1.0 - t) * (fromIntegral start) + t * (fromIntegral goal)
  9.  
  10.  
  11. interpolate :: Int -> Int -> Int -> Int -> [Int]
  12. interpolate start goal distance t =
  13. if t < distance
  14. then (interpolate' start goal ((fromIntegral t) / (fromIntegral distance))) : interpolate start goal distance (t+1)
  15. else
  16. []
  17.  
  18. interpolateCoordinates :: (Int, Int) -> (Int, Int) -> [(Int, Int)]
  19. interpolateCoordinates coordinateA coordinateB = zip xValues yValues
  20. where
  21. distance = (manhattanDistance coordinateA coordinateB)
  22. xValues = interpolate (fst coordinateA) (fst coordinateB) distance 1
  23. yValues = interpolate (snd coordinateA) (snd coordinateB) distance 1
  24.  
  25. convertToCoordinates' :: [String] -> (Int, Int) -> [(Int, Int)]
  26. convertToCoordinates' [] _ = []
  27. convertToCoordinates' (x:xs) previousCoordinate = previousCoordinate : interpolateCoordinates previousCoordinate newCoordinate ++ convertToCoordinates' xs newCoordinate
  28. where
  29. direction = head x
  30. newCoordinate = case direction of
  31. 'U' -> (fst previousCoordinate, snd previousCoordinate + read (tail x) :: Int)
  32. 'D' -> (fst previousCoordinate, snd previousCoordinate - read (tail x) :: Int)
  33. 'L' -> (fst previousCoordinate - read (tail x) :: Int, snd previousCoordinate)
  34. 'R' -> (fst previousCoordinate + read (tail x) :: Int, snd previousCoordinate)
  35.  
  36. convertToCoordinates :: [String] -> [(Int, Int)]
  37. convertToCoordinates wire = convertToCoordinates' wire (1,1)
  38.  
  39. findShortestManhattanDistance :: [[String]] -> Int
  40. findShortestManhattanDistance wires = minimum $ (map (\x -> manhattanDistance (1,1) x) (tail $ intersect (convertToCoordinates (head wires)) (convertToCoordinates (last wires))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement