Corrige el código: Evita modificar un arreglo

Tu amigo está intentando escribir una función que realice las siguientes transformaciones:

let x = [3, 3, 3, 3, 3, 3, 3]

// Cada vez que se llama a la función con x, se muestran los siguientes resultados:

change(x, 0)  // [3, 3, 3, 3, 3, 3, 3]
change(x, 1)  // [3, 2, 2, 2, 2, 2, 3]
change(x, 2)  // [3, 2, 1, 1, 1, 2, 3]
change(x, 3)  // [3, 2, 1, 0, 1, 2, 3]

Nota: La función change() no debe modificar el arreglo original. Después de cada llamada a la función, el x original debe seguir siendo igual a [3, 3, 3, 3, 3, 3, 3].

Se le ocurre el siguiente código:

function change(x, times) {
  for(let i = 0; i < x.length; i++) {
    let j = 1; 
    while (j <= times) {
      if (i >= j && i < x.length-j) {
        x[i]--; 
      }
      j++; 
    }
  }
  return x; 
}

¡Ups! Parece que el código modifica el arreglo original. Corrige este código incorrecto para que la función deje de modificar el arreglo original.

Observa lo siguiente:

Ejemplos

let x = [3, 3, 3, 3, 3, 3, 3]

// Lo que queremos:
change(x, 2) => [3, 2, 1, 1, 1, 2, 3]

change(x, 2) => [3, 2, 1, 1, 1, 2, 3]

// Lo que obtenemos:
change(x, 2) => [3, 2, 1, 1, 1, 2, 3]  // Hasta aquí, todo bien...

change(x, 2) => [3, 1, -1, -1, -1, 1, 3] // El arreglo se modifica :(

Notas

  • Si esto te resulta confuso, copia y pega el código incorrecto en un entorno REPL y experimenta con él para entender qué hace la función.
  • Pista: Intenta crear una copia del arreglo de entrada.
  • Si esto te resulta familiar, forma parte de una solución para el problema Alfombra concéntrica.