Nehmen Sie eine Matrix positiver Ganzzahlen als Eingabe und geben Sie die einzelnen Summen der Elemente auf den diagonalen Linien durch die Matrix aus.
Sie sollen nur die Linien zählen, die diagonal nach unten und rechts verlaufen. Sie müssen mit der Diagonale beginnen, die nur das untere linke Element enthält, dann mit der Diagonale der Länge zwei darüber (falls vorhanden) und so weiter bis zu der Diagonale, die nur das obere rechte Element enthält, wie unten dargestellt.
Beispiel:
Input:
8 14 5 1
10 5 5 8
6 6 8 10
15 15 4 11
Output:
15, 21, 20, 32, 29, 13, 1
(Diagonals: {{15},{6,15},{10,6,4},{8,5,8,11},{14,5,10},{5,8},{1}})
Input:
1
Output:
1
Input:
1 5
Output:
1, 5
Input:
4
1
Output:
1, 4
Input:
17 4 5
24 16 5
9 24 10
1 14 22
1 21 24
4 4 17
24 25 17
Output:
24, 29, 22, 39, 47, 70, 43, 9, 5
Eingabe- und Ausgabeformate sind wie immer optional.
Das ist Code-Golf , also gewinnt die kürzeste Einsendung in jeder Sprache.
Antworten:
Haskell ,
4037 BytesProbieren Sie es online! Verbrauch:
(foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]]
.Edit: Danke an Ørjan Johansen für -3 Bytes!
Ungolfed:
z
ist eine Liste mit unendlich vielen Nullen. Inf
klappen wir die Liste der Listenm
um, indem wir zwei Listen mit der Funktion kombinieren#
. In#
der ersten Listes
sind die akkumulierten Spaltensummen enthalten und in der zweiten Listet
ist die neue Zeile, die hinzugefügt werden soll. Wir verschiebens
ein Element nach rechts, indem wir vorne eine Null hinzufügens
und elementweise addieren undt
mitzipWith(+)
. Das
es beliebig groß sein kann, müssen wirt
durch Anhängen genügend Nullen auffüllenz
.quelle
foldl1$(.(++z)).zipWith(+).(0:)
.Mathematica,
53-54BytesReine Funktion, die ein 2D-Array als Eingabe verwendet und eine Liste zurückgibt. (Einträge müssen keine ganzen oder geraden Zahlen sein.)
Diagonal[#,k]
Gibt diek
th-Diagonale über (oder unter, fallsk
negativ) der Hauptdiagonale zurück.{k,-l@#,l@#&@@#}
Berechnet den Bereich der benötigten Diagonalen basierend auf den Abmessungen des Eingabearrays. UndTr
summiert die Einträge jeder Diagonale.quelle
Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
MATL , 6 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
s==sum(x(:))
an die MATLAB-Konvention zu halten, als es MATL zu tun scheint?sum(x)
undsum(x,1)
. Bei einer Matrix ist es manchmal ärgerlichx
, dass siesum(x)
sich anders verhält, wenn die Matrix eine Zeile enthält. Aber am Ende habe ich mich für Matlab entschieden, damit die beiden Sprachen näher zusammenkommen. und einigefun(x,1)
Funktionen für die häufigsten Fälle hinzufügenGelee , 5 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
ŒD
?ŒD
verhinderte die seltsame Reihenfolge, dass es nützlich war.JavaScript (ES6),
6558 Bytesquelle
a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
CJam ,
2221 BytesDank Martin Ender 1 Byte gespeichert
Anonymer Block erwartet das Argument auf dem Stapel und belässt das Ergebnis auf dem Stapel.
Probieren Sie es online!
Wie es funktioniert
quelle
05AB1E , 17 Bytes
Probieren Sie es online!
Erläuterung
quelle
J , 7 Bytes
Probieren Sie es online!
Das ist ziemlich einfach:
Schräge umgekehrte Linien sind die Diagonalen des Arrays. Dies summiert also nur die Diagonalen.
quelle
Python 2 , 62 Bytes
Probieren Sie es online!
quelle
Gelee , 8 Bytes
Probieren Sie es online!
Die Hälfte des Codes wird verwendet, um die Ergebnisse in die richtige Reihenfolge zu bringen.
Wie?
quelle
Perl 5, 47 Bytes
quelle
R, 45 Bytes
Unbenannte Funktion, die ein Objekt der Matrixklasse als Eingabe verwendet:
Unter Verwendung der in dieser Antwort erläuterten Idee .
quelle
unname
, aber dies ist trotzdem eine großartige Lösung!Oktave, 71 Bytes
Angenommen, A ist eine Matrix, zum Beispiel:
Dann haben wir:
Beachten Sie, dass das Vertauschen der Matrix die Reihenfolge der diagonalen Summen umkehrt, wodurch insgesamt zwei Bytes in der for-Schleife gespeichert wurden.
Ausgabe:
quelle
[m,n]=size(A);for i=1:m+n-1,trace([zeros(m-1,m);A'](i:end,:)),end
Spart 6 Bytes. Octave kann direkte Indizierungen und Inline-Zuweisungen durchführen. Leider unter der Annahme, dass eine Variable exist in den Arbeitsraum vor dem Ausführen des Codes ist nicht zulässig, so dass ich glaube , Sie verwenden müsseninput
, wie dies auf 75 Bytes sichern zu bringen. Netter Ansatz, also +1 von mir :) Und willkommen bei PPCG! =)zeros(m-1,m)
kann geschrieben werden~e(m-1,m)
, Einsparung von 4 Bytes :) Ordentlich nicht wahr?Python, 126 Bytes
f
Funktioniert nur auf dem unteren Dreiecksabschnitt, also transponiere ich ihn und erhalte den oberen Dreiecksabschnitt auf diese Weise. Ich weiß nicht, warum dief
Funktion für negative Werte nicht funktioniert (ichf
habe sie kürzer gewählt, weil der Teil zum Abrufen der Negative nicht funktioniert hat).quelle
C 148 Bytes
Versuchen Sie es online
quelle
PHP, 81 Bytes
Eingabe als 2D-Array übernehmen
Probieren Sie es online!
quelle
Awk, 67 Bytes
Ungolfed:
Awk-Splits auf Whitespace
$n
sind dasn
th-Feld (1-indiziert);NF
ist die Anzahl der Felder in der Zeile,NR
ist die Nummer der aktuellen Zeile. Undefinierte Variablen sind 0 und werden bei der ersten Verwendung erstellt.quelle
PHP, 86 Bytes
eine speicherfreundliche Lösung in zwei Varianten:
Nimmt Eingaben von Skriptparametern entgegen und verwendet den Unterstrich als Trennzeichen.
verwende die Standardeinstellungen (nicht die Standard-php.ini) oder versuche sie online
quelle
Clojure, 81 Bytes
Sehr ausführlich, da Listen mit Nullen aufgefüllt werden, sodass wir nur die spaltenweise Summe berechnen können.
quelle
Mathematica 73 Bytes
Dies funktioniert für JEDES 2D-Array. Mxn (nicht nur nxn) gibt
das Array am Ende des Codes wie folgt ein (der letzte Testfall)
Eingabe in Form [{a, b, c, d ...}, {m, n}]
quelle