Hintergrund
Jellys arithmetische Atome werden automatisch vektorisiert. Tatsächlich ist x + y immer dann gut definiert, wenn x und y Zahlen oder zerlumpte Anordnungen von Zahlen sind. Jellys Quellcode implementiert dieses Verhalten mithilfe eines generischen Vektorisierers. Bei dieser Herausforderung werden jedoch nur Ganzzahlen und verschachtelte Ganzzahl-Arrays hinzugefügt.
Definitionen
Definieren Sie die Tiefe von x als 0, wenn x eine Ganzzahl ist, als 1, wenn es sich um ein (möglicherweise leeres) flaches Array von Ganzzahlen handelt, und als n + 1, wenn es mindestens ein Element der Tiefe n und keine Elemente der Tiefe k> enthält n .
Auf diese Weise hat 1 die Tiefe 0 , [] und [1] und [1, 1] die Tiefe 1 , [[], [] und [[1], [1] und [1] und [1] , []] haben die Tiefe 2 , [1, [1, [1]] haben die Tiefe 3 usw.
Die Operation x + y ist wie folgt definiert.
Wenn x und y die Tiefe 0 haben , geben Sie ihre Summe zurück.
Wenn x und y gleiche, aber positive Tiefen haben, wenden Sie rekursiv + auf alle Elemente von x und die entsprechenden Elemente von y an .
Wenn x und y unterschiedlich lang sind, hängen Sie das Ende des längeren Arrays an das Array der Summen an.
Gib das Ergebnis zurück.
Wenn die Tiefe von x streng kleiner als die Tiefe von y ist , wenden Sie rekursiv + auf x und alle Elemente von y an und geben Sie das Ergebnis zurück.
Machen Sie das Gegenteil, wenn die Tiefe von y strikt kleiner als die von x ist .
Betrachten Sie zum Beispiel die Operation [1, [2, 3], [4]] + [[[10, 20], [30], 40, 50], 60] .
Die Tiefe des linken Arguments ist 2 , während die Tiefe des rechten Arguments 3 ist. Wir berechnen also [1, [2, 3], [4]] + [[10, 20], [30], 40, 50 ] und [1, [2, 3], [4]] + 60 .
[1, [2, 3], [4]] und [[10, 20], [30], 40, 50] haben beide die Tiefe 2 , also berechnen wir 1 + [10, 20] , [2, 3] + [30] und [4] + 40 .
1 + [10, 20] = [1 + 10, 1 + 20] = [11, 21]
[2, 3] + [30] = [2 + 30, 3] = [32, 3]
Beachten Sie, dass 3 unberührt bleibt, da es kein passendes Element enthält.
[4] + 40 = [4 + 40] = [44]
50 kein passendes Element hat, so ist das Ergebnis [[[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]] , was zu [61, [62, 63], [64]] führt .
Das Endergebnis ist [[[11, 21], [32, 3], [44], [50], [61, [62, 63], [64]] .
Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die zwei Ganzzahlen, zwei verschachtelte Arrays von Ganzzahlen oder eine Kombination davon als Eingabe verwendet und deren Summe wie oben definiert zurückgibt.
Wenn Ihre Sprache über mehrere Array-ähnliche Typen verfügt (Listen, Tupel, Vektoren usw.), können Sie einen beliebigen Typ für Ihre Antwort auswählen. Der Rückgabetyp muss mit dem Argumenttyp übereinstimmen.
Um langweilige und unschlagbare Lösungen zu vermeiden , können Sie diese Sprache möglicherweise nicht verwenden , wenn eine Sprache genau diese Funktion aufweist.
Alle eingebauten Sprachen aller anderen Sprachen sind erlaubt. Wenn Ihre Sprache dies zulässt, können Sie den eingebauten Zusatz überladen und / oder neu definieren.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Testfälle
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]]]]
Um weitere Testfälle zu generieren, können Sie dieses Jelly-Programm verwenden .