Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

231
Vistas
Cómo reducir los bucles for excesivamente redundantes

Actualmente estoy desarrollando un juego de ajedrez y encontré un problema con la redundancia de código en mi clase de obispo. Estoy tratando de crear una función que obtenga todos los movimientos posibles de un alfil. Para hacerlo, crearía un bucle for que evaluara todas las diagonales del alfil y rompería el bucle cuando toque el final del tablero o una pieza. El problema con este código es que es redundante, ya que para evaluar todas las diagonales que puede recorrer un alfil, debo tener 4 bucles for. Una versión simplificada del código se ve así

 var list = [1,0,0,0,1,0,0,1]; // 1d list var index = 5; // position of "bishop" for (let i = index, j = list.length; i < j; i++) { if (list[i] === 1) { // if true, return instance of 1 and break loop console.log("first instance of 1 going right, found at " + i); break; } } for (let i = index; i >= 0; i--) { if (list[i] === 1) { // if true, return instance of 1 and break loop console.log("first instance of 1 going left, found at " + i); break; } }

Aunque este código funciona, cuando se trata de un alfil que puede moverse en 4 direcciones, esto es bastante repetitivo y puede generar problemas en el futuro. ¿Hay alguna manera de que pueda reducir los 4 bucles for (o 2 en el ejemplo anterior) a 1 sin el costo de la eficiencia? Debido a que la respuesta requiere el concepto correcto, no hay mucho para mostrar mis intentos de resolver este problema.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Recomendaría usar una función para reemplazar los bucles. Esto hace que el mismo bucle se pueda reutilizar sin copiarlo y pegarlo.

Aquí hay una muestra de código:

 // Board width and height. const boardSize = 8; // The chess board (2d array, x index first). const board = [[0,0,1, ...],[1,0,1, ...], ...]; // Get the maximum distance a piece can travel in a direction. function findTravelDistance(x,y,dirX,dirY) { for (let n = 0;; n++) { // Calculate the position from moving n spaces. var newX = x + n*dirX, newY = y + n*dirY; // Return if the piece is off the board. if (newX < 0 || newX >= boardSize || newY < 0 || newY >= boardSize) return n - 1; // Return if the piece hits a one. if (board[newX][newY] === 1) return n; } } // Array containing all directions a bishop can move. const bishopDirections = [[1,1], [1,-1], [-1,1], [-1,-1]]; // Take x and y as starting position. // Return an array of distances corresponding to directions in bishopDirections function findBishopTravelDistances(x,y) { var distances = [0,0,0,0]; // Calculate distances for all directions. for (let i = 0; i < bishopDirections.length; i++) distances[i] = findTravelDistance() return distances; }
about 4 years ago · Juan Pablo Isaza Denunciar

0

¿Qué tal un iterador izquierdo y derecho para combinar ambos bucles y mirar en ambas direcciones al mismo tiempo?

 var list = [1,0,0,0,1,0,0,1]; var index = 5; var left = index - 1; var right = index + 1; while(left >= 0 || right < list.length) { if(list[left] === 1) { console.log("first instance of 1 going left, found at " + left); break; } if(list[right] === 1) { console.log("first instance of 1 going right, found at " + right); break; } if(left >= 0) left--; if(right < list.length) right++; }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda