Sie erhalten ein mehrdimensionales Array von ganzen Zahlen. Jede Bemaßung hat eine feste Größe (so dass sie bei 2D immer rechteckig ist). Ihr Programm sollte die Summen in jeder Dimension berechnen und die Summen als die neuen letzten Elemente in dieser Dimension anhängen.
Angenommen, die Eingabe- und Ausgabearrays sind A und B und die Größe der Dimension i von A ist n i . B hätte die gleiche Anzahl von Dimensionen wie A und die Größe der Dimension i wäre n i +1. B j 1 , j 2 , ..., j m ist die Summe von A k 1 , k 2 , ..., k m wobei:
- k i = j i wenn j i <= n i
- 0 <k i <= n i, wenn j i = n i +1
Für die Eingabe:
[[1 2 3]
[4 5 6]]
Ihr Programm (oder Ihre Funktion) sollte Folgendes ausgeben:
[[1 2 3 6]
[4 5 6 15]
[5 7 9 21]]
Die Eingabe enthält nur das Array. Die Gesamtanzahl der Dimensionen und die Größe jeder Dimension werden in der Eingabe nicht angegeben. (Sie können sie jedoch über Ihren eigenen Code aus dem Array abrufen.) Sie können beliebige Listenformate in Ihrer Sprache verwenden, sofern darin nicht die Anzahl der Dimensionen oder Dimensionsgrößen direkt angegeben ist.
Die Eingabe hat mindestens eine Dimension und mindestens ein Element im Array.
Das ist Code-Golf. Kürzester Code gewinnt.
Testfälle
Input:
[5 2 3]
Output:
[5 2 3 10]
Input:
[[1 2 3] [4 5 6]]
Outputs:
[[1 2 3 6] [4 5 6 15] [5 7 9 21]]
Input:
[[[1] [1] [1] [0]]]
Output:
[[[1 1] [1 1] [1 1] [0 0] [3 3]] [[1 1] [1 1] [1 1] [0 0] [3 3]]]
Input:
[[[[-1]]]]
Output:
[[[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]] [[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]]]
quelle
Antworten:
J, 14 Bytes
Verwendung:
Die Funktion entspricht der folgenden
(0|:],+/)^:(#@$)
, verwendet jedoch ein benutzerdefiniertes Adverb zum Speichern von Parens.Erklärung für letzteren Code von rechts nach links:
^:(#@$)
Wiederholen Sie dies^:
für die Anzahl#
der Dimensionen$
:],+/
Verketten Sie,
das Argument]
mit der Summe in der letzten Dimension+/
0|:
drehen Sie die Dimensionen,|:
indem Sie die erste0
an das Ende der Dimensionsliste setzenNach dem oben beschriebenen Vorgang erhalten wir die ursprüngliche Eingabe mit Summen für alle Dimensionen zurück.
Überprüfen Sie für meine ältere Lösung den Versionsverlauf.
Probieren Sie es hier online aus.
quelle
Mathematica,
3220 BytesBeispiel:
Erläuterung:
Die vollständige Form von
{{1, 2, 3}, {4, 5, 6}}
istList[List[1, 2, 3], List[4, 5, 6]]
. Ersetzen Sie dann alleList
s im Ausdruck durch die Funktion({##,+##}&)
.quelle
Python 2, 95 Bytes
Dies durchläuft jede Dimension und verknüpft ihre Summen mit NumPy.
Ich bin über NumPy's gestolpert
r_
, was zum Golfen ziemlich genial ist.r_[:n]
ist kürzer alsrange(n)
und viel mächtiger (zBr_[:4, 7, 8, 10:100:10]
). Es kann auch andere Dinge tun, wie die Verkettung entlang einer beliebigen Achse.Anwendungsbeispiel:
quelle
APL,
16-15BytesVielen Dank an @ user23013 für das Golfen mit 3 Bytes und das Herausfinden des richtigen Eingabeformats.
Überprüfen Sie die Testfälle online mit TryAPL .
Idee
Die allgemeine Idee ist dieselbe wie in meiner CJam-Einreichung, für die APL eine viel kürzere Implementierung zulässt. Es besteht aus nur zwei Schritten:
Summieren Sie das Array über seine äußerste Dimension.
Wiederholen Sie Schritt 1 für jedes Subarray.
Code
quelle
,⊂(,1)(,1)(,1)(,0)
und,⊂,⊂,⊂,¯1
jeweils. So können Sie ein anderes Zeichen entfernen.Pip ,
18-15BytesDies ist eine anonyme Funktion, die das Array als Argument verwendet und das Ergebnis zurückgibt. Beispielaufruf unter Verwendung des
-p
Flags, um eine lesbare Ausgabe zu erhalten:Die Idee ist im Grunde die gleiche wie bei Dennis 'APL , obwohl sie unabhängig abgeleitet wurde. Genauer:
Diese Methode funktioniert, weil
+
(zusammen mit vielen anderen Operatoren) Listen in Pip elementweise bearbeitet werden - eine Funktion, die von Array-Programmiersprachen wie APL inspiriert ist. Wenn Sie also$+
eine Liste mögen[[1 2 3] [4 5 6]]
, ist das Ergebnis[5 7 9]
wie gewünscht. Wird auch im Listen- oder Skalartest verwendet :[1 2 3] - [1 2 3]
gives[0 0 0]
, was wahr ist (wie alle Listen mit Ausnahme der leeren Liste).Vorherige 18-Byte-Version:
Änderungen:
[1 2 3] != 123
).M
eine niedrigere Priorität haben als?
(obwohl ich das wahrscheinlich gerade jetzt ändern werde): Ohne sie würde der Code als analysiert(Ja=a?af)M(aAE$+a)
, was zu bizarren Fehlermeldungen führen würde. Das mittlere Argument eines ternären Operators kann jedoch ein beliebiger Ausdruck beliebiger Priorität sein, ohne dass Klammern erforderlich sind. Indem ich die Liste zum Wahrheitsgehalt mache, kann ich diese beiden Bytes retten.quelle
APL (25)
In APL-Arrays sind Dimensionen integriert. Dies ist also eine Funktion, die ein n- dimensionales Array annimmt und dann entlang jeder Dimension summiert.
Erläuterung:
N←⍵
: Speichern Sie das Array inN
.⍴⍴N
: bekommen die Menge der DimensionenN
hat. (⍴
Gibt die Dimensionen, also⍴↑(1 2 3)(4 5 6)
gibt2 3
, so⍴⍴
die Abmessungen der Abmessungen gibt.){
...}¨⍳
: für jede Zahl von 1 bis⍴⍴N
:+/[⍵]N
: SummeN
entlang der Dimension⍵
N,[⍵]←
: Füge das ErgebnisN
in diese Dimension einN
: endlich zurückN
.quelle
↑(1 2 3)(4 5 6)
tut, ist einfach ein 2-dimensionales Array aus 2 1-dimensionalen zu konstruieren↑
. Es ist keine eingebaute Notation und verallgemeinert nicht die Art und Weise, wie Sie vielleicht denken. Die kanonische Art und Weise, die 3. und 4. Anordnung zu konstruieren, wäre1 4 1⍴1 1 1 0
und1 1 1 1⍴¯1
, es ist jedoch auch möglich, sie ohne Bezugnahme auf die Größen zu konstruieren, z. B. kann die dritte Anordnung auch mit konstruiert werden↑⍉⍪(,1)(,1)(,1)(,0)
, die vierte kann mit konstruiert werden↑⍪⊂⍪¯1
.f←{0=≡⍵:⍵⋄f¨⍵,+/⍵}⋄f((1 2)(3 4))((5 6)(7 8))
), aber es scheint, dass verschachtelte Vektoren und Arrays unterschiedlich sind und ersteres Skalare nicht von Singletons unterscheidet ...{×≡⍵:∇¨⍵,+/⍵⋄⍵}((1 2)(3 4))((5 6)(7 8))
. Behoben:{×⍴⍴⍵:∇↓⍵,+/⍵⋄⍵}1 4 1⍴1 1 1 0
. Es ist jetzt kürzer als Mathematica ...CJam, 36 Bytes
Dies ist eine rekursiv benannte Funktion, die ein Array aus dem Stapel entfernt und ein Array zurückgibt.
Probieren Sie die Testfälle im CJam-Interpreter aus .
Idee
Leider gibt es in CJam keinen automagischen Operator, mit dem beliebig verschachtelte Arrays hinzugefügt werden können. Deshalb müssen wir ihn selbst implementieren. Glücklicherweise erweisen sich zwei Infix-Operatoren
:
(Reduzieren) und.
(Vektorisieren) als hilfreich für diese Aufgabe.In Schritt eins wird die Anzahl der Dimensionen berechnet. Dies ist ganz einfach: Konvertieren Sie das Array in seine Zeichenfolgendarstellung und zählen Sie die Anzahl der führenden [ 's.
Um ein Array einer Dimension zu verkleinern, führen Sie normalerweise Folgendes aus
:+
:+
Würde für ein Array mit zwei Dimensionen eine Verkettung anstelle einer Addition durchgeführt, müssen wir sie vektorisieren:.+
Würde nun für ein Array mit drei Dimensionen ein Array mit zwei Dimensionen bearbeiten und erneut eine Verkettung durchführen. Dieses Mal müssen wir vektorisieren.+
:Für den allgemeinen Fall, ein Array der Dimension D , müssen wir eins
:
, D - 1.
und eins verketten+
.Dies summiert das Array natürlich nur über seine äußerste Dimension. Wir können dies lösen, indem wir eine Funktion S definieren , die die Dimension berechnet (und nichts tut, wenn sie Null ist), die Summe wie oben angegeben ausführt und sich schließlich auf die Elemente des Arrays anwendet.
Code
quelle
Ruby (
181139119108 Bytes)Angenommen, die Eingabe wird als JSON übergeben.
quelle
d
in dieser Antwort nur die 95 Bytes zählen .Java, 669 Bytes
Ich werde nicht lügen, ich bin ziemlich stolz auf mich: p
erweitert mit Testing:
Das Ausführen der erweiterten Testversion gibt Folgendes aus:
quelle