sfondo
Gli atomi aritmetici di Jelly si vectorizzano automaticamente. Infatti, x + y è ben definita quando x ed y sono numeri o matrici irregolari dei numeri. Il codice sorgente di Jelly implementa questo comportamento usando un vettorizzatore generico, ma per questa sfida prenderemo in considerazione solo l'aggiunta di numeri interi e matrici di interi nidificati.
definizioni
Definisci la profondità di x come 0 se x è un numero intero, come 1 se è un array piano intero (possibilmente vuoto) e come n + 1 se contiene almeno un elemento di profondità n e nessun elemento di profondità k> n .
In questo modo, 1 ha profondità 0 , [] e [1] e [1, 1] hanno profondità 1 , [[], []] e [[1], [1]] e [[1]] e [1 , []] ha profondità 2 , [1, [1, [1]]] ha profondità 3 , ecc.
L'operazione x + y è definita come segue.
Se x ed y hanno profondità 0 , restituire loro somma.
Se x ed y hanno profondità uguali ma positivi, applicare ricorsivamente + a tutti gli articoli di x ed i corrispondenti elementi di y .
Se x ed y hanno lunghezze diverse, aggiungere la coda della matrice più alla matrice di somme.
Restituisce il risultato.
Se la profondità di x è strettamente inferiore alla profondità di y , applica ricorsivamente + a x e tutti gli elementi di y e restituisce il risultato.
Fai il contrario se la profondità di y è strettamente inferiore a quella di x .
Ad esempio, considera l'operazione [1, [2, 3], [4]] + [[[10, 20], [30], 40, 50], 60] .
La profondità dell'argomento sinistro è 2 , mentre la profondità dell'argomento destro è 3 , quindi calcoliamo [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] hanno entrambi la profondità 2 , quindi calcoliamo 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]
Si noti che 3 rimane intatto, poiché non ha un elemento corrispondente.
[4] + 40 = [4 + 40] = [44]
50 non ha un elemento corrispondente, in modo che il risultato è [[[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]] , risultante in [61, [62, 63], [64]] .
Il risultato finale è [[[11, 21], [32, 3], [44], 50], [61, [62, 63], [64]]] .
Compito
Scrivi un programma o una funzione che accetta due numeri interi, due matrici nidificate di numeri interi o una loro combinazione come input e restituisce la loro somma, come definito sopra.
Se la tua lingua ha più tipi simili a array (elenchi, tuple, vettori, ecc.) Puoi scegliere uno qualsiasi di essi per la tua risposta. Il tipo restituito deve corrispondere al tipo di argomento.
Per evitare soluzioni noiose e imbattibili, se una lingua ha questa operazione esatta come integrata, non è possibile utilizzare quella lingua.
Sono ammessi tutti i built-in di tutte le altre lingue. Se la tua lingua preferita lo consente, puoi sovraccaricare e / o ridefinire l'aggiunta integrata.
Questo è code-golf , quindi vince il codice più breve in byte.
Casi test
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]]]]
Per generare più casi di test, è possibile utilizzare questo programma Jelly .