Tengo una matriz como esa: [ 'a', 'b', 'c', 'd', 'e' ]. Necesito dividirlo por la mitad, pero eligiendo un índice para que sea el nuevo centro , es decir, siempre manteniendo el mismo número de elementos antes y después del índice elegido para ser el nuevo centro. Ejemplos del resultado deseado:

// index: 1
[ 'e', 'a', 'b', 'c', 'd' ]

// index: 3
[ 'b', 'c', 'd', 'e', 'a' ]

Intenté algunas cosas con slice y valores negativos:

(function splitChosingMiddle(arr, index) {
  const half = Math.floor(arr.length / 2)
  return [
    ...arr.slice(index - half),
    ...arr.slice(index, half + 1)
  ]
})([ 'a', 'b', 'c', 'd', 'e' ], 0)

Pero solo funciona si el nuevo centro es el índice 0, cualquier otro índice bloquea la lógica. Creo que no entiendo el uso de longitudes negativas para splice.

¿Alguien podría ayudarme con este algoritmo?

2
Erick Petrucelli 28 oct. 2017 a las 01:07

3 respuestas

La mejor respuesta

Encuentre el delta entre el índice y el medio, corte los elementos usando el delta para mover esa cantidad al inicio / final de la matriz:

function splitChosingMiddle(arr, index) {
  const half = Math.floor((arr.length) / 2)
  const delta = index - half

  return [
    ...arr.slice(delta, arr.length),
    ...arr.slice(0, delta)
  ]
}

console.log(JSON.stringify(splitChosingMiddle([ 'a', 'b', 'c', 'd', 'e' ], 0)));
console.log(JSON.stringify(splitChosingMiddle([ 'a', 'b', 'c', 'd', 'e' ], 1)));
console.log(JSON.stringify(splitChosingMiddle([ 'a', 'b', 'c', 'd', 'e' ], 2)));
console.log(JSON.stringify(splitChosingMiddle([ 'a', 'b', 'c', 'd', 'e' ], 3)));
console.log(JSON.stringify(splitChosingMiddle([ 'a', 'b', 'c', 'd', 'e' ], 4)));
0
Ori Drori 27 oct. 2017 a las 23:06

Prueba algo esto

function rotate (array, index) {
  var head = array.slice();
  var tail = head.splice(array.length - index, index);
  return tail.concat(head);
}

Debería hacer el truco. Pero trata de entenderlo

0
Dayan Moreno Leon 27 oct. 2017 a las 22:25

Esto parece un problema de tarea de CS, por lo que daré una pista en lugar de una solución directa para ahorrar un poco de diversión.

Parece que index es una serie de rotaciones, es decir, toma el último elemento de la lista y colócalo al principio (JavaScript tiene shift y pop que pueden ser útiles).

-1
Ryan 27 oct. 2017 a las 22:19