Advertisement
Guest User

Untitled

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