Фон
Арифметические атомы желе векторизуются автоматически. На самом деле, x + y четко определено всякий раз, когда x и y являются числами или рваными массивами чисел. Исходный код Jelly реализует это поведение с использованием универсального векторизатора, но для этой задачи мы рассмотрим только добавление целых и вложенных целочисленных массивов.
Определения
Определите глубину x как 0, если x является целым числом, как 1, если это (возможно, пустой) плоский массив целых чисел, и как n + 1, если он содержит хотя бы один элемент глубины n и не имеет элементов глубины k> п .
Таким образом, 1 имеет глубину 0 , [] и [1] и [1, 1] имеют глубину 1 , [[], []] и [[1], [1]] и [[1]] и [1 , []] имеют глубину 2 , [1, [1, [1]]] имеют глубину 3 и т. д.
Операция x + y определяется следующим образом.
Если x и y имеют глубину 0 , вернуть их сумму.
Если x и y имеют одинаковую, но положительную глубину, рекурсивно примените + ко всем элементам x и соответствующим элементам y .
Если x и y имеют разную длину, добавьте хвост более длинного массива к массиву сумм.
Вернуть результат.
Если глубина x строго меньше, чем глубина y , рекурсивно примените + к x и всем элементам y и верните результат.
Сделайте обратное, если глубина y строго меньше, чем x .
Например, рассмотрим операцию [1, [2, 3], [4]] + [[[10, 20], [30], 40, 50], 60] .
Глубина левого аргумента равна 2 , а глубина правого аргумента равна 3 , поэтому мы вычисляем [1, [2, 3], [4]] + [[10, 20], [30], 40, 50 ] и [1, [2, 3], [4]] + 60 .
[1, [2, 3], [4]] и [[10, 20], [30], 40, 50] оба имеют глубину 2 , поэтому мы вычисляем 1 + [10, 20] , [2, 3] + [30] и [4] + 40 .
1 + [10, 20] = [1 + 10, 1 + 20] = [11, 21]
[2, 3] + [30] = [2 + 30, 3] = [32, 3]
Обратите внимание, что 3 остается нетронутым, поскольку у него нет соответствующего элемента.
[4] + 40 = [4 + 40] = [44]
50 не имеет соответствующий элемент, так что результат [[[11, 21], [32, 3], [44], 50]] .[1, [2, 3], [4]] + 60 = [1 + 60, [2, 3] + 60, [4] + 60] = [61, [2 + 60, 3 + 60], [ 4 + 60]] , что приводит к [61, [62, 63], [64]] .
Окончательный результат [[[11, 21], [32, 3], [44], 50], [61, [62, 63], [64]]] .
задача
Напишите программу или функцию, которая принимает два целых числа, два вложенных массива целых чисел или их комбинацию в качестве входных данных и возвращает их сумму, как определено выше.
Если ваш язык имеет несколько массивоподобных типов (списки, кортежи, векторы и т. Д.), Вы можете выбрать любой из них для ответа. Тип возвращаемого значения должен соответствовать типу аргумента.
Чтобы предотвратить скучные и непобедимые решения, если язык имеет это точную работу как встроенный, вы не можете использовать этот язык.
Все встроенные модули всех других языков разрешены. Если ваш язык позволяет это сделать, вы можете перегрузить и / или переопределить встроенное дополнение.
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
Контрольные примеры
0 + 0 = 0
[-1, 0, -1] + [1] = [0, 0, -1]
[] + [0] = [0]
[] + 0 = []
[] + [] = []
[[], 0] + [] = [[], []]
[1, 2, 3] + 10 = [11, 12, 13]
[1, 2, 3] + [10] = [11, 2, 3]
[1, 2, 3] + [10, [20]] = [[11, 12, 13], [21, 2, 3]]
[1, 2, 3, []] + [10, [20]] = [11, [22], 3, []]
[1, [2, [3, [4]]]] + [10, [20]] = [[11, [21]], [[12, [22]], [13, [24]]]]
Чтобы создать больше тестовых случаев, вы можете использовать эту программу Jelly .