Фон
Арифметичні атоми Желе векторнізуються автоматично. Насправді, 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 та поверніть результат.
Зробіть навпаки, якщо глибина y суворо менша, ніж х .
Наприклад, розглянемо операцію [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 .