Antecedentes
Los átomos aritméticos de Jelly se vectorizan automáticamente. De hecho, x + y está bien definido cuando x e y son números o matrices desiguales de números. El código fuente de Jelly implementa este comportamiento usando un vectorizador genérico, pero para este desafío, solo consideraremos la adición de enteros y matrices de enteros anidados.
Definiciones
Defina la profundidad de x como 0 si x es un número entero, como 1 si es un conjunto plano (posiblemente vacío) de enteros, y como n + 1 si contiene al menos un elemento de profundidad n y ningún elemento de profundidad k> n .
De esta manera, 1 tiene profundidad 0 , [] y [1] y [1, 1] tienen profundidad 1 , [[], []] y [[1], [1]] y [[1]] y [1 , []] tiene profundidad 2 , [1, [1, [1]]] tiene profundidad 3 , etc.
La operación x + y se define de la siguiente manera.
Si x e y tienen profundidad 0 , devuelve su suma.
Si X y Y tienen profundidades iguales pero positivos, aplicar de forma recursiva + a todos los artículos de x y los artículos correspondientes de y .
Si x y y tienen diferentes longitudes, añadir la cola de la matriz más tiempo para la matriz de sumas.
Devuelve el resultado.
Si la profundidad de x es estrictamente menor que la profundidad de y , aplique recursivamente + a x y todos los elementos de y , y devuelva el resultado.
Hacer lo contrario, si Y 's profundidad es estrictamente menor que x ' s.
Por ejemplo, considere la operación [1, [2, 3], [4]] + [[[10, 20], [30], 40, 50], 60] .
La profundidad del argumento izquierdo es 2 , mientras que la profundidad del argumento derecho es 3 , entonces calculamos [1, [2, 3], [4]] + [[10, 20], [30], 40, 50 ] y [1, [2, 3], [4]] + 60 .
[1, [2, 3], [4]] y [[10, 20], [30], 40, 50] tienen profundidad 2 , por lo que calculamos 1 + [10, 20] , [2, 3] + [30] y [4] + 40 .
1 + [10, 20] = [1 + 10, 1 + 20] = [11, 21]
[2, 3] + [30] = [2 + 30, 3] = [32, 3]
Tenga en cuenta que 3 permanece intacto, ya que no tiene un elemento coincidente.
[4] + 40 = [4 + 40] = [44]
50 no tiene un elemento de adaptación, por lo que el resultado es [[[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]] , lo que resulta en [61, [62, 63], [64]] .
El resultado final es [[[11, 21], [32, 3], [44], 50], [61, [62, 63], [64]]] .
Tarea
Escriba un programa o una función que tome dos enteros, dos matrices anidadas de enteros o una combinación de los mismos como entrada y devuelva su suma, como se definió anteriormente.
Si su idioma tiene múltiples tipos de matriz (listas, tuplas, vectores, etc.), puede elegir cualquiera de ellos para su respuesta. El tipo de retorno debe coincidir con el tipo de argumento.
Para evitar soluciones aburridas e inmejorables, si un idioma tiene esta operación exacta como una función incorporada, no puede usar ese idioma.
Todos los elementos integrados de todos los demás idiomas están permitidos. Si su idioma de elección lo permite, puede sobrecargar y / o redefinir la adición incorporada.
Este es el código de golf , por lo que gana el código más corto en bytes.
Casos de prueba
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 generar más casos de prueba, puede usar este programa Jelly .