Задачи
January 24

Task. Разминировать бомбу

Задача. Необходимо разминировать бомбу. У вас есть код в виде кругового массива длиной N и ключ k. Чтобы расшифровать код, нужно заменить каждое число. Все числа заменяются одновременно.

  • Если k > 0, замените i-е число суммой следующих k чисел.
  • Если k < 0, замените i-е число суммой предыдущих k чисел.
  • Если k == 0, замените i-е число на 0.

Необходимо вернуть расшифрованный код.

Пояснение: в циклическом массиве следующий элемент после arr[N - 1] - это arr[0]. Соответственно, предыдущий элемент для arr[0] - это arr[N - 1].

Входные данные: размер массива, а также элементы массива - значения от 0 до 100.

Примеры

  1. arr [5,7,1,4], k = 3
    Output: [12,10,16,13]
    Пояснение: [7+1+4, 1+4+5, 4+5+7, 5+7+1]
  2. arr = [2,4,9,3], k = -2
    Output: [12,5,6,13]
    Пояснение: [3+9, 2+3, 4+2, 9+4]

Разбор

Рассмотрим различные случаи:

  1. k == 0. Если ключ равен нулю, то по условию все элементы заменяются на 0.
  2. k > 0. Для каждого элемента массива суммируем k последующих элементов, учитывая круговой характер массива. При выходе за пределы индекса массива, используем модуль % для перехода к началу.
  3. k < 0. Для каждого элемента массива суммируем |k| предыдущих элементов. Переход к началу массива также выполняется с помощью индексации %.

Детали смотрите ниже.

Реализация

static int[] DefuseBomb(int[] arr, int k) {
	int N = arr.Length;
    var res = new int[N];
    if (k == 0) {
        return res;
    }

    for (int i = 0; i < N; i++)
    {
        if (k > 0) {
            for (int j = i + 1; j < i + k + 1; j++) {
                res[i] += arr[j % N];
            }
        }
        else 
        {
            for (int j = i - Math.Abs(k); j < i; j++) {
                res[i] += arr[(j + N) % N];
            }
        }
    }

    return res;
}

https://gist.github.com/unilecs/69dff66f69bf3b70780ad4291b1b66bc

Play-test

https://dotnetfiddle.net/i8HSnp