Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Runtime: 56 ms, faster than 85.77% of JavaScript online submissions for Queens That Can Attack the King.
  2. // Memory Usage: 34 MB, less than 100.00% of JavaScript online submissions for Queens That Can Attack the King.
  3.  
  4. var queensAttacktheKing = function(queens, king) {
  5.     const TOP = 'top'
  6.     const BOTTOM = 'bottom'
  7.     const LEFT = 'left'
  8.     const RIGHT = 'right'
  9.     const BOTTOM_LEFT = 'bottom_left'
  10.     const BOTTOM_RIGHT = 'bottom_right'
  11.     const TOP_LEFT = 'top_left'
  12.     const TOP_RIGHT = 'top_right'
  13.     const CANT_ATTACK = 'cant_attack'
  14.     let closestMap = {}
  15.    
  16.     const getSquareDistance = (a, b) => {
  17.         return Math.pow(Math.abs(a[0] - b[0]), 2) + Math.pow(Math.abs(a[1] - b[1]), 2)
  18.     }
  19.    
  20.     const getClosest = (point, a, b) => {
  21.         return getSquareDistance(point, a) < getSquareDistance(point, b) ? a : b
  22.     }
  23.    
  24.     const getAttackDirection = (king, queen) => {
  25.         let isSameRow = queen[0] === king[0]
  26.         let key = CANT_ATTACK
  27.         if (isSameRow && king[1] > queen[1]) {
  28.             key = LEFT
  29.         }
  30.         if (isSameRow && king[1] < queen[1]) {
  31.             key = RIGHT
  32.         }
  33.         let isSameColumn = queen[1] === king[1]
  34.         if (isSameColumn && king[0] > queen[0]) {
  35.             key = TOP
  36.         }
  37.         if (isSameColumn && king[0] < queen[0]) {
  38.             key = BOTTOM
  39.         }
  40.         let isDiagnal = Math.abs(king[0] - queen[0]) ===
  41.             Math.abs(king[1] - queen[1])
  42.         if (isDiagnal && king[0] < queen[0] && king[1] < queen[1]) {
  43.             key = BOTTOM_RIGHT
  44.         }
  45.         if (isDiagnal && king[0] > queen[0] && king[1] > queen[1]) {
  46.             key = TOP_LEFT
  47.         }
  48.         if (isDiagnal && king[0] < queen[0] && king[1] > queen[1]) {
  49.             key = BOTTOM_LEFT
  50.         }
  51.         if (isDiagnal && king[0] > queen[0] && king[1] < queen[1]) {
  52.             key = TOP_RIGHT
  53.         }
  54.         return key
  55.     }
  56.    
  57.     queens.forEach(queen => {
  58.         let direction = getAttackDirection(king, queen)
  59.         if (direction === CANT_ATTACK) {
  60.             return
  61.         }
  62.         if (!closestMap.hasOwnProperty(direction)) {
  63.             closestMap[direction] = queen
  64.         } else {
  65.             closestMap[direction] = getClosest(king, queen, closestMap[direction])
  66.         }
  67.     })
  68.     return Object.keys(closestMap).map(direction => closestMap[direction])
  69. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement