Wenn Sie eine Matrix haben, geben Sie eine Darstellung der Matrix aus, in der sich das obere linke Element oben befindet, die Antidiagonale die mittlere Zeile und das untere rechte Element unten.
Betrachten Sie beispielsweise die folgende Matrix:
1 2 3
4 5 6
7 8 9
Die Diamantversion dieser Matrix ist:
1
4 2
7 5 3
8 6
9
Eingänge und Ausgänge
Eine Eingabematrix wird als eine Liste von Listen (oder etwas Ähnlichem in der Sprache Ihrer Wahl) angegeben. Die Ausgabe soll ebenfalls eine Liste von Listen sein.
Die Matrizen enthalten nur positive ganze Zahlen.
Die Eingabematrix muss nicht unbedingt quadratisch sein.
Die Eingangsmatrix beträgt mindestens 1 × 1.
Testfälle
Input: [[1]]
Output: [[1]]
Input: [[1,2],[3,4]]
Output: [[1],[3,2],[4]]
Input: [[1,2,3],[4,5,6]]
Output: [[1],[4,2],[5,3],[6]]
Input: [[11,2,5],[3,99,3],[4,8,15],[16,23,42]]
Output: [[11],[3,2],[4,99,5],[16,8,3],[23,15],[42]]
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
code-golf
array-manipulation
matrix
Tödlich
quelle
quelle
Antworten:
J, 7 Bytes
Dies ist ein unbenanntes monadisches Verb, das eine Matrix verwendet und eine Liste von Antidiagonalen zurückgibt:
Teste es hier.
Erläuterung
/.
ist in J integriert, um eine Funktion auf jede Antidiagonale anzuwenden. Leider werden diese Antidiagonalen in der entgegengesetzten Reihenfolge wie hier angegeben.<@|.
wenden wir zuerst an,|.
was<
die Antidiagonale umkehrt, und dann , um sie zu boxen (was die einzige Möglichkeit ist, ein unregelmäßiges Array in J zurückzugeben, da normale Arrays immer rechteckig sind, sodass die Antidiagonalen mit Nullen aufgefüllt würden).quelle
Python, 91 Bytes
Teste es auf Ideone .
Python + NumPy, 69 Bytes
Erwartet ein 2D-NumPy-Array als Eingabe und gibt eine Liste von NumPy-Arrays zurück. Teste es auf Ideone .
quelle
Gelee, 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
Mathematica,
5856 BytesAnonyme Funktion, nimmt verschachtelte Arrays.
quelle
Length[#]
wo
ist speichern\[Transpose]
. Und wahrscheinlich eine andere von AliasingLength
.Length@#&@@#
für ASCII nur bei gleicher Bytezahl.CJam, 17 Bytes
Ein unbenannter Block (Funktion), der die Matrix auf dem Stapel erwartet und durch ihre Antidiagonalen ersetzt.
Teste es hier.
Dies (gefunden von Sp3000) funktioniert für die gleiche Byteanzahl:
Erläuterung
Dies lässt sich am besten anhand eines Beispiels erklären. Betrachten Sie die Eingabe:
quelle
Python 2,
8887 BytesStellen Sie 0s voran, zip und entfernen Sie dann falsche Elemente. Gibt eine Liste von Tupeln zurück. Dies wird verwendet
map(None,...)
, umzip_longest
fehlende Stellen aufzufüllenNone
undfilter(None,...)
fehlerhafte Elemente zu entfernen.Nervend, brauchen wir eine zusätzliche hinzuzufügen
[]
Reihe dermap
zu gewährleisten , dass eine Liste von Tupeln zurückgegeben wird, damap(None,*[[1]])
kehrt[1]
anstatt[(1,)]
für eine 1x1 - Matrix. Die zusätzliche Reihe wird durch dasfilter
zwar abgestreift .(Danke an @Dennis für -1 Byte)
quelle
Ruby,
6866 BytesAnonyme Funktion.
quelle
Mathematica, 60 Bytes
Dabei
handelt es sich um ein Unicode-Zeichen, das Mathematica als Postfix-\[Transpose]
Operator liest .Dies ist ein bisschen länger als die andere Mathematica-Lösung, aber ich dachte, ich würde es veröffentlichen, weil es nicht das
Diagonals
eingebaute verwendet und einen völlig anderen Ansatz verwendet.Erläuterung
Dies transponiert zuerst die Matrix (so dass die Antidiagonalen in der richtigen Reihenfolge erscheinen, wenn die Matrix abgeflacht wurde). Dann bilden wir
List
die Zellen der Matrix zusammen mit dem Index ab, der jedes Matrixelementi
in{i, {x, y}}
wox
undy
sind die Koordinaten des Elements in der Matrix.Dadurch wird die äußerste Dimension abgeflacht, sodass wir nun eine flache Liste der Matrixelemente (mit ihren Koordinaten) in Spalten-Hauptreihenfolge haben.
Dies gruppiert diese Elemente nach der Summe ihrer Koordinaten. Beachten Sie, dass Antidiagonale konstante Linien sind.
x+y
Dies entspricht also genau der von uns gewünschten Gruppierung. Die Reihenfolge innerhalb jeder Gruppe bleibt erhalten. Jetzt müssen wir nur noch einmal die Koordinaten loswerden. Dies geschieht über die eher kryptischen:Dies ordnet die Funktion
#&@@@#&
jeder Gruppe zu, die sich auf jedes Element in der Gruppe bezieht#&
, und#
ist einfach das erste Argument, dh das ursprüngliche Matrixelement.quelle
als gelesen wird\[transpose]
?T
: reference.wolfram.com/language/ref/character/Transpose.html ...\[Transpose]
ist einfach die ASCII-Transliteration dieses Unicode-Zeichens. Das Kopieren des Unicode-Zeichens oder der Transliteration in Mathematica funktioniert.Oktave, 77 Bytes
Mit ein wenig Missbrauch der
accumarray
Funktion:Dies definiert eine anonyme Funktion. Um es zu verwenden, weisen Sie es einer Variablen zu oder verwenden Sie
ans
.Eingabe ist die Matrix mit
:
als Zeilentrennzeichen. Die Ausgabe ist ein Zellenarray, das ein Array für jede Zeile enthält (Oktav entspricht gezackten Arrays). Dies wird durch Octave angezeigt, wobei die Indizes des Zellenfeldes und der Inhalt jeder Zelle angezeigt werden. Probieren Sie es hier aus .So zeigen Sie das Ergebnis nur durch Leerzeichen und Zeilenumbrüche getrennt an: 83 Byte
Sie können es auch hier ausprobieren .
quelle
JavaScript (Firefox),
8675 Bytes11 Bytes dank @Neil gespart!
Funktioniert in Firefox 30+. Nimmt ein Array von Arrays.
quelle
a.concat(a[0]).slice(1)
, um ein Array mit der richtigen Länge zu erhalten. Auch[for(of)]
ist nicht ES6; Normalerweise schreibe ich es als (Firefox 30+) oder so.concat
undslice
. Vielen Dank!Oktave,
6362 BytesEin Byte entfernt dank
@DonMue ...@LuisMendo!Ich bin den langweiligen Weg gegangen und habe die Antidiagonalen gemengt.
Probelauf auf ideone .
quelle
'uni'
zu'un'
Haskell,
8382 Bytesnimi hat ein byte gespeichert. Vielen Dank!
quelle
Python, 128 Bytes (Anzahl)
quelle
lambda
in ein Lambda umwandeln, das Sie als Vorlage verwenden können.lambda A:[[A[U][I-U]for U in range(max(I-len(A)+1,0),min(len(A[0])-1,I)+1)]for I in range(len(A+A[0])-1)]
(wie in deiner ursprünglichen Revision) wäre etwas kürzer. Sie sollten auch zu wechselnA[U][I-U]
,A[I-U][U]
um sich an der Frage zu orientieren.Pyth ,
4117 BytesProbieren Sie es online!
Inspiriert von @ Doorknobs Lösung für ein anderes Problem .
Wie es funktioniert:
Vorheriger Versuch:
Probieren Sie es online!
Wie es funktioniert:
quelle
Groovy,
777375Nimmt Array von Arrays als Eingabe und gibt Array von Arrays zurück.
Versuch es
EDIT: Ich habe vergessen, die Antwort auszugeben, nachdem ich sie hinzugefügt habe, steigt die Punktzahl auf 75.
quelle