tło
Arytmetyczne atomy galaretki wektoryzują się automatycznie. W rzeczywistości, suma x + y jest dobrze określone, gdy x i y są liczbami lub nierównych tablice liczb. Kod źródłowy Jelly implementuje to zachowanie za pomocą ogólnego wektoryzatora, ale w przypadku tego wyzwania rozważymy tylko dodanie liczb całkowitych i zagnieżdżonych tablic liczb całkowitych.
Definicje
Zdefiniuj głębokość x jako 0, jeśli x jest liczbą całkowitą, jako 1, jeśli jest (być może pustą) płaską tablicą liczb całkowitych, i jako n + 1, jeśli zawiera co najmniej jeden element głębokości n i brak elementów głębokości k> n .
W ten sposób 1 ma głębokość 0 , [] i [1], a [1, 1] ma głębokość 1 , [[], []] i [[1], [1]] i [[1]] i [1 , []] ma głębokość 2 , [1, [1, [1]]] ma głębokość 3 itd.
Operacja x + y jest zdefiniowana w następujący sposób.
Jeśli x i y mają głębokość 0 , powrót ich sumę.
Jeśli x i y mają równe ale pozytywne głębokości, rekurencyjnie zastosować + do wszystkich elementów X i odpowiednich elementów y .
Jeśli x i y mają różne długości, dodać ogon dłuższym tablicy w tablicy sum.
Zwróć wynik.
Jeśli głębokość x jest ściśle mniejsza niż głębokość y , rekurencyjnie zastosuj + do x i wszystkich elementów y , i zwróć wynik.
Zrobić odwrotnie, jeśli y „s głębokość jest ściśle mniejsze niż x ” s.
Rozważmy na przykład operację [1, [2, 3], [4]] + [[[10, 20], [30], 40, 50], 60] .
Głębokość lewego argumentu wynosi 2 , podczas gdy głębokość prawego argumentu wynosi 3 , więc obliczamy [1, [2, 3], [4]] + [[10, 20], [30], 40, 50 ] i [1, [2, 3], [4]] + 60 .
[1, [2, 3], [4]] i [[10, 20], [30], 40, 50] mają głębokość 2 , więc obliczamy 1 + [10, 20] , [2, 3] + [30] i [4] + 40 .
1 + [10, 20] = [1 + 10, 1 + 20] = [11, 21]
[2, 3] + [30] = [2 + 30, 3] = [32, 3]
Zauważ, że 3 pozostaje nietknięte, ponieważ nie ma pasującego elementu.
[4] + 40 = [4 + 40] = [44]
W pobliżu
50 nie posiada pasujący element, a więc jest [[[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]] , co daje [61, [62, 63], [64]] .
Ostateczny wynik to [[[11, 21], [32, 3], [44], 50], [61, [62, 63], [64]]] .
Zadanie
Napisz program lub funkcję, która pobiera na wejściu dwie liczby całkowite, dwie zagnieżdżone tablice liczb całkowitych lub ich kombinację i zwraca ich sumę, jak zdefiniowano powyżej.
Jeśli twój język ma wiele typów tablicowych (listy, krotki, wektory itp.), Możesz wybrać dowolny z nich dla swojej odpowiedzi. Typ zwracany musi być zgodny z typem argumentu.
Aby zapobiec nudnym i bezkonkurencyjnym rozwiązaniom, jeśli język ma dokładnie taką operację jako wbudowaną, nie możesz używać tego języka.
Wszystkie wbudowane wszystkie pozostałe języki są dozwolone. Jeśli Twój język na to pozwala, możesz przeładować i / lub zmienić definicję wbudowanego dodatku.
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Przypadki testowe
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]]]]
Aby wygenerować więcej przypadków testowych, możesz użyć tego programu Jelly .