Nehmen Sie eine nicht leere Matrix / ein nicht leeres numerisches Array mit positiven ganzen Zahlen als Eingabe. Geben Sie in dieser Reihenfolge die Summen der ersten Zeile und Spalte, dann der zweiten Zeile und Spalte zurück und fahren Sie fort, bis keine Zeilen oder Spalten mehr vorhanden sind.
Angenommen, die Eingabe lautet:
2 10 10 2 4
9 7 7 2 9
1 7 6 2 4
7 1 4 8 9
Dann sollte die Ausgabe sein:
45, 33, 16, 17
Denn: 2+9+1+7+10+10+2+4=45, 7+7+1+7+2+9=33, 6+4+2+4=16, 8+9=17
.
Testfälle:
Testfälle haben das folgende Format:
Input
---
Output
5
---
5
..........
1 4
----
5
..........
7
2
---
9
..........
8 3 7 10 3 7 10 1
10 7 5 8 4 3 3 1
1 6 4 1 3 6 10 1
2 3 8 2 8 3 4 1
---
62 40 33 18
..........
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20
---
320 226 235 263 135 26 20
..........
7 10 1
4 4 2
6 3 4
1 4 10
5 7 6
---
34 20 20
Als Arrays:
[[5]]
[[1,4]]
[[7],[2]]
[[8,3,7,10,3,7,10,1],[10,7,5,8,4,3,3,1],[1,6,4,1,3,6,10,1],[2,3,8,2,8,3,4,1]]
[[30,39,48,1,10,19,28],[38,47,7,9,18,27,29],[46,6,8,17,26,35,37],[5,14,16,25,34,36,45],[13,15,24,33,42,44,4],[21,23,32,41,43,3,12],[22,31,40,49,2,11,20]]
[[7,10,1],[4,4,2],[6,3,4],[1,4,10],[5,7,6]]
Das ist Code-Golf, also gewinnt die kürzeste Lösung in jeder Sprache.
10,7,7,1
, die zweite Zeile ist9,7,7,2,9
und die Summe ist59
. Und so weiterAntworten:
MATL , 16 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Betrachten Sie als Beispiel die Eingabe
Der Code bildet
&n:w:!Xl
den Spaltenvektor[1; 2; 3; 4]
und den Zeilenvektor[1 2 3 4 5]
. DannXl
berechnet die Mindestelementweise mit Broadcast, die die Matrix gibtX:
Linearisiert diese Matrix (in der Hauptreihenfolge der Spalten) in den Spaltenvektor[1; 1; 1; 1; 1; 2; 2; ... ; 4]
. Dieser Vektor und die linearisierte Eingabematrix, erhalten alsGX:
, werden als Eingaben an dieaccumarray(... @sum)
Funktion oder übergeben1XQ
. Dies berechnet die Summe der zweiten Eingabe, gruppiert nach den Werten der ersten Eingabe.quelle
Gelee , 3 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
CJam ,
2318 BytesAnonymer Block, der das Argument auf dem Stapel erwartet und das Ergebnis auf dem Stapel belässt.
Probieren Sie es online!
Erläuterung
quelle
q~[{(:+\z}h;]2/::+p
[
. Aber als Block denke ich, dass ich es brauche, weil es nicht den gesamten Stapel darunter auch erfassen muss.05AB1E ,
1411 BytesProbieren Sie es online!
Erläuterung
quelle
JavaScript (ES6), 60 Byte
Naive Lösung, kann ein besserer Weg sein.
quelle
Mathematica, 60 Bytes
Inspiriert von Luis Mendos MATL-Antwort .
Erläuterung:
Min~Array~Dimensions@#
Erstellt eine Matrix wie die folgende:Dann
Pick[#,...,n]~Total~2
nimmt die Einträge aus der Eingangsmatrix , die die Anzahl entspricht ,n
in der Matrix oben seltsamen und summiert sie. Endlich geht es...~Table~{n,Min[d=Dimensions@#]}
vorbein
.Dies ist 1 Byte kürzer als der naive Ansatz:
quelle
Haskell,
5049 BytesProbieren Sie es online!
Wenn es mindestens eine Zeile mit mindestens einem Element gibt, ist das Ergebnis die Summe der ersten Zeile und der Köpfe aller anderen Zeilen, gefolgt von einem rekursiven Aufruf mit den Endpunkten aller anderen Zeilen. In allen anderen Fällen ist das Ergebnis die leere Liste.
Edit: Ørjan Johansen hat ein Byte gespeichert. Vielen Dank!
quelle
Oktave ,
6452 BytesVielen Dank an @StewieGriffin für das Speichern von 1 Byte!
Dies definiert eine anonyme Funktion.
Probieren Sie es online!
Erläuterung
Der Code ähnelt meiner MATL-Antwort (siehe Erklärung dort).
Es wurden zwei Bytes mit gespeichert,
1:size(x)
anstatt1:size(x,1)
die Tatsache auszunutzen, die1:[a b]
sich genauso verhält wie1:a
. Auch ein Byte wurde mit gespeichert1:rows(x')
statt1:size(x,2)
, dank Stewie.quelle
k, 19 Bytes
Probieren Sie es online!
Erläuterung:
quelle
05AB1E , 16 Bytes
Probieren Sie es online! oder Probieren Sie alle Tests aus
quelle
Oktave ,
6360 BytesProbieren Sie es online!
Die Antwort für diese Matrix:
ist der Vektor der Zeilensummen seines oberen Dreiecks:
plus den Vektor der Spaltensummen des unteren Dreiecks:
Genau das ist meine Antwort.
quelle
Julia , 62 Bytes
Funktioniert rekursiv, indem die gesamte Matrix aufsummiert und dann die Summe des nächsten Blocks abgezogen wird. Wahrscheinlich nicht der effektivste Ansatz, aber schön intuitiv.
quelle
Java 7, 248 Bytes
Probieren Sie es hier aus.
Allgemeine Erklärung:
Angenommen, das Eingabearray hat Abmessungen von 4x6. Der erste Teil des Codes erstellt eine temporäre Matrix und füllt sie wie folgt:
Und im zweiten Teil des Codes durchläuft es diese temporäre Matrix und summiert alle Werte der Eingabematrix für jede der unterschiedlichen Zahlen in der temporären Matrix.
Erklärung des Codes:
quelle
Perl 6 ,
6355 Bytes{($_ Z [Z] $_).kv.map(->\a,\b{b.flatmap(*[a..*]).sum -b[0;a]})}
$_
ist die Matrixeingabe für die anonyme Funktion.skip
ist die Eingabematrix, deren erste Zeile entfernt wurde[Z] .skip
ist die Transponierte der Eingangsmatrix, wobei die erste Zeile entfernt ist; das heißt, die transponieren ohne ihre erste Spalte$_ Z [Z] .skip
Zippt die Eingabematrix mit der Transponierten-ohne-Erste-Spalte und erstellt eine Liste((first-row, first-column-sans-first-element), (second-row, second-column-sans-first-element), ...)
.kv
stellt jedem Paar seinen Index voranmap({...})
Ordnet die Paare mit einer Funktion zu, die ihr erstes Argument (den Index)$^a
und ihr zweites (das Zeilen- / Spaltenpaar) übernimmt$^b
$^b.flatmap(*[$^a..*]).sum
Entfernt die ersten$^a
Elemente jedes Zeilen- / Spaltenpaares und summiert dann alle verbleibenden ElementeNach einiger Überlegung wurde mir klar, dass das Abziehen der ersten Spalte der Transponierten vor dem Zippen gleichbedeutend mit dem Subtrahieren der doppelt beitragenden diagonalen Elemente war, wie in meiner ersten Lösung. Dadurch konnte ich diese Subtraktion löschen und jedes Argument nur einmal für die Zuordnungsfunktion verwenden, was die
{...$^a...$^b...}
Methode zur Übergabe von Argumenten an eine anonyme Funktion effizienter machte als das Original-> \a, \b {...a...b...}
.quelle
Vim,
66, 52 BytesProbieren Sie es online!
Das falsche Werkzeug für den Job ...
quelle
Gelee , 10 Bytes
Ein vollständiges Programm, das die Werte druckt
Probieren Sie es online!
Wie?
quelle
Python + NumPy, 75 Byte
Die Eingabe ist ein 2D-Numpy-Array.
Probieren Sie es online aus
quelle
Python 2 , 97 Bytes
Probieren Sie es online!
quelle
Pyth,
1615 BytesNimmt ein Array von Zahlen im Python-Stil und gibt ein Array von Summen zurück.
Versuch es!
Erläuterung
quelle
GNU APL 1.7, 123 Bytes
Die Lösung erfordert zwei Funktionen: Eine erstellt ein globales Array und die zweite ruft das Array auf, wobei die Summen rekursiv an dieses Array angehängt werden.
∇
beginnt und beendet die Funktion. Beidef
undg
nehmen Tabellen als Argumente (im Wesentlichen 2D-Arrays). Diese können mit erstellt werdenX←rows cols ⍴ 1 2 3 4...
.R←⍬
Weist der globalen Variablen einen leeren Vektor zuR
.g N
ruft die zweite Funktion mit demselben Argument auf, das auch für die erste angegeben wurde.⍴N
gibt die Dimensionen vonN
; Wenn eine der Dimensionen Null ist, müssen keine Zeilen / Spalten mehr addiert werden.0∈⍴N
Gibt 1 zurück, wenn die Dimensionen eine Null enthalten.→2+2×0∈⍴N
verzweigt zu Zeile 2 plus 2 mal dem Rückgabewert der∈
Funktion: Wenn keine Null vorhanden ist, wird∈
0 zurückgegeben und die Funktion verzweigt zu Zeile 2 (der nächsten Zeile). Wenn es ist ein Null ist ,∈
kehrt die Funktion 1 und verzweigt in Zeile 4 (das Ende der Funktion, also imreturn
Wesentlichen)./
ist der Reduktionsoperator. Es wendet das linke Argument, das ein Operator (+
) ist, auf jedes Element in der Liste an, das als rechtes Argument angegeben ist.N[1;]
gibt die gesamte erste Zeile der Tabelle undN[;1]
die erste Spalte an.(+/N[1;])+(+/N[;1])-N[1;1]
summiert die erste Zeile und Spalte und subtrahiert den Wert in der oberen linken Ecke, da er sowohl in der Spaltensumme als auch in der Zeilensumme addiert wird.R←R,...
hängt den neu berechneten Wert an den globalen Vektor anR
.Die Funktion ruft sich dann selbst auf (solange rekursiv, bis keine Zeilen oder Spalten mehr vorhanden sind). Der
⊃
Auswahloperator erhält das angegebene Element aus der Liste.1⊃⍴N
gibt die Anzahl der Zeilen und2⊃⍴N
die Anzahl der Spalten an.⍳
gibt alle Zahlen von 1 bis zur angegebenen Zahl an. Der↓
Operator drop entfernt Elemente am Anfang der Liste. Wenn Sie beim Zugriff auf Elemente aus einer Tabelle oder einem Vektor (z. B.N[1 2 3]
) mehrere Indizes angeben , greift APL auf jeden zu. Gibt daher1↓⍳1⊃⍴N
die Indizes jeder Zeile mit Ausnahme der ersten (2, 3, 4, ..., N
) an und1↓⍳2⊃⍴N
gibt einen ähnlichen Vektor mit Ausnahme der Spalten an.g N[1↓⍳1⊃⍴N;1↓⍳2⊃⍴N]
ruft die Funktion erneut auf, jedoch ohne die erste Zeile oder Spalte.quelle
PHP, 76 Bytes
Probieren Sie es online!
quelle
Mathematica, 116 Bytes
Eingabeformular
quelle
Clojure, 98 Bytes
Durchläuft die Eingabe mit Zeilen- und Spaltenindizes (sehr ausführlich), erstellt eine Hash-Map mit dem Minimum von
i
und führtj
als Schlüssel Hash-Maps mit+
einer sortierten Map zusammen und gibt Werte zurück.quelle
R, 102 Bytes
Gibt eine anonyme Funktion zurück. druckt die Ergebnisse mit einem nachgestellten Zeilenumbruch auf die Konsole. Ich brauche wahrscheinlich einen anderen Ansatz.
Iteriert über das Minimum der Zeilen und Spalten. Gibt die Summe aus
x[,1]
(der ersten Spalte) undx[1,-1]
der ersten Zeile mit Ausnahme des ersten Eintrags aus und setztx
dann eine Matrix gleichx[-1,-1]
(dhx
ohne die erste Zeile und Spalte). Leider führt das einfache Setzen dazu,x=x[-1,-1]
dass es bei einer quadratischen Matrix fehlschlägt, dax
die Teilmenge bei 2x2 eher einen Vektor als eine Matrix zurückgibt.Probieren Sie es online!
quelle
Java 7,
280276 BytesProbieren Sie es hier aus.
Alternativer Ansatz im Vergleich zu meiner vorherigen Antwort mit Arrays, die am Ende immer noch kürzer ist als diese (also habe ich ein bisschen Zeit damit verschwendet, diesen alternativen Ansatz auszuprobieren).
Allgemeine Erklärung:
Inspiration von @Rileys erstaunlicher 05AB1E-Antwort
Diese Antwort verwendet eine Liste und entfernt nach Berechnung jeder Summe die erste Spalte und erste Zeile aus der Listenmatrix , wie folgt :
Erklärung des Codes:
quelle
Python, 93 Bytes
Ähnlich wie die Antwort von mbomb007, jedoch ohne NumPy
quelle