Corrija o código: Não altere o array original

Seu amigo está tentando escrever uma função que realize as seguintes transformações:

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

// A cada chamada da função com x, os seguintes resultados são exibidos:

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]

Observação: A função change() não deve alterar o array original. Após cada chamada da função, o x original ainda deve ser igual a [3, 3, 3, 3, 3, 3, 3].

Ele cria o seguinte 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; 
}

Ops! Parece que o código altera o array original. Corrija esse código para que a função não altere mais o array original.

Veja abaixo:

Exemplos

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

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

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

// O que obtemos:
change(x, 2) => [3, 2, 1, 1, 1, 2, 3]  // Até aqui, tudo certo...

change(x, 2) => [3, 1, -1, -1, -1, 1, 3] // O array foi alterado :(

Notas

  • Se isso parecer confuso, copie e cole o código incorreto em um ambiente REPL e experimente com ele para entender o que a função está fazendo.
  • Dica: Tente criar uma cópia do array de entrada.
  • Se isso parecer familiar, faz parte de uma solução para o problema Tapete Concêntrico.