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.