fundo
Os átomos aritméticos da geléia se vetorizam automaticamente. De fato, x + y é bem definido sempre que x e y são números ou matrizes irregulares de números. O código fonte do Jelly implementa esse comportamento usando um vetorizador genérico, mas para esse desafio, consideraremos apenas a adição de números inteiros e matrizes inteiras aninhadas.
Definições
Defina a profundidade de x como 0 se x for um número inteiro, como 1 se for uma matriz plana (possivelmente vazia) de números inteiros e como n + 1 se contiver pelo menos um elemento de profundidade n e nenhum elemento de profundidade k> n .
Dessa forma, 1 tem profundidade 0 , [] e [1] e [1, 1] têm profundidade 1 , [[], []] e [[1], [1]] e [[1]] e [1 , []] possui profundidade 2 , [1, [1, [1]]] possui profundidade 3 , etc.
A operação x + y é definida da seguinte forma.
Se x e y tem profundidade 0 , volte sua soma.
Se x e y têm profundidades iguais, mas positivas, de forma recursiva aplicam + a todos os itens de x e os itens correspondentes do y .
Se x e y têm diferentes comprimentos, acrescentar a cauda da matriz de mais tempo para a série de somas.
Retorne o resultado.
Se a profundidade de x for estritamente menor que a profundidade de y , aplique recursivamente + a x e todos os itens de y e retorne o resultado.
Faça o oposto se a profundidade de y for estritamente menor que x .
Por exemplo, considere a operação [1, [2, 3], [4]] + [[[10, 20], [30], 40, 50], 60] .
A profundidade do argumento da esquerda é 2 , enquanto a profundidade do argumento da direita é 3 , portanto calculamos [1, [2, 3], [4]] + [[10, 20], [30], 40, 50 ] e [1, [2, 3], [4]] + 60 .
[1, [2, 3], [4]] e [[10, 20], [30], 40, 50] têm profundidade 2 , então calculamos 1 + [10, 20] , [2, 3] + [30] e [4] + 40 .
1 + [10, 20] = [1 + 10, 1 + 20] = [11, 21]
[2, 3] + [30] = [2 + 30, 3] = [32, 3]
Observe que 3 permanece intocado, pois não possui um elemento correspondente.
[4] + 40 = [4 + 40] = [44]
50 não tem um elemento correspondente, de modo que o resultado é [[[11, 21], 44 [32, 3], [], 50]] .[1, [2, 3], [4]] + 60 = [1 + 60, [2, 3] + 60, [4] + 60] = [61, [2 + 60, 3 + 60], [ 4 + 60]] , resultando em [61, [62, 63], [64]] .
O resultado final é [[[11, 21], [32, 3], [44], 50], [61, [62, 63], [64]]] .
Tarefa
Escreva um programa ou uma função que use dois números inteiros, duas matrizes aninhadas de números inteiros ou uma combinação dos mesmos como entrada e retorne sua soma, conforme definido acima.
Se o seu idioma tiver vários tipos de array (listas, tuplas, vetores, etc.), você poderá escolher qualquer um deles para sua resposta. O tipo de retorno deve corresponder ao tipo de argumento.
Para evitar soluções chatas e imbatíveis, se um idioma tiver essa operação exata como um built-in, você não poderá usá-lo.
Todos os built-ins de todos os outros idiomas são permitidos. Se o seu idioma de escolha permitir, você poderá sobrecarregar e / ou redefinir a adição interna.
Isso é código-golfe , então o código mais curto em bytes vence.
Casos de teste
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]]]]
Para gerar mais casos de teste, você pode usar este programa Jelly .