enkryptor

Untitled

Feb 17th, 2022
818
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. function knight(start, finish) {
  3.   console.log(start, finish)
  4.   const s = getCoords(start)
  5.   const f = getCoords(finish)
  6.   return getShortestPath(s.x, s.y, f.x, f.y, new Set(), 0)
  7. }
  8.  
  9. function getShortestPath(startX, startY, targetX, targetY, visited, len) {
  10.   if (startX === targetX && startY === targetY) {
  11.     return len
  12.   }
  13.   visited.add(`${startX}:${startY}`)
  14.   const paths = [...getPaths(startX, startY)]
  15.     .filter(p => isInBounds(p) && !visited.has(`${p.x}:${p.y}`))
  16.     .map(p => getShortestPath(p.x, p.y, targetX, targetY, visited, len + 1))
  17.     .filter(x => !Number.isNaN(x))
  18.   return paths.length > 0 ? Math.min(...paths) : NaN
  19. }
  20.  
  21. function getCoords(str) {
  22.   return {
  23.     x: 'abcdefgh'.indexOf(str[0]),
  24.     y: Number(str[1]) - 1
  25.   }
  26. }
  27.  
  28. function* getPaths(x, y) {
  29.   yield {x: x+2, y: y+1}
  30.   yield {x: x+2, y: y-1}
  31.   yield {x: x-2, y: y+1}
  32.   yield {x: x-2, y: y-1}
  33.   yield {x: x+1, y: y+2}
  34.   yield {x: x+1, y: y-2}
  35.   yield {x: x-1, y: y+2}
  36.   yield {x: x-1, y: y-2}
  37. }
  38.  
  39. function isInBounds(p) {
  40.   return p.x >= 0 && p.x < 8 && p.y >= 0 && p.y < 8
  41. }
  42.  
Advertisement
Add Comment
Please, Sign In to add comment