Komprimieren Sie eine Sparse-Matrix mit Compressed Sparse Row (CSR-, CRS- oder Yale-Format) .
Hierbei handelt es sich alle um dieselbe Form der Komprimierung (ignorieren Sie New Yale).
Die Eingabe kann eine beliebige 2D-Datenstruktur sein (Liste der Listen usw.): z
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Und die Ausgabe sollte drei 1d Datenstrukturen (Liste usw.) sein, dass die Ausgänge bezeichnen A
, IA
und JA
zum Beispiel
[5, 8, 3, 6]
[0, 0, 2, 3, 4]
[0, 1, 2, 1,]
Der Prozess wird von Wikipedia beschrieben:
Das Array A hat die Länge NNZ und enthält alle Nicht-Null-Einträge von M in der Reihenfolge von links nach rechts von oben nach unten ("Zeilenmajor").
Das Array IA hat die Länge m + 1. Es wird durch diese rekursive Definition definiert:
IA [0] = 0 IA [i] = IA [i - 1] + (Anzahl der Nicht-Null-Elemente in der (i - 1) -ten Zeile in der ursprünglichen Matrix)
Somit speichern die ersten m Elemente von IA den Index in A des ersten Nicht-Null-Elements in jeder Reihe von M, und das letzte Element IA [m] speichert NNZ, die Anzahl der Elemente in A, die auch als das Element A angesehen werden kann Index in A des ersten Elements einer Phantomzeile direkt hinter dem Ende der Matrix M. Die Werte der i-ten Zeile der ursprünglichen Matrix werden aus den Elementen A [IA [i]] bis A [IA [i + gelesen 1] - 1] (einschließlich an beiden Enden), dh vom Beginn einer Zeile bis zum letzten Index kurz vor dem Beginn der nächsten. [5]
Das dritte Array JA enthält den Spaltenindex in M jedes Elements von A und hat daher auch die Länge NNZ.
Wenn Ihre Sprache keine tatsächlichen Datenstrukturen unterstützt, können Ein- und Ausgaben Text sein.
Testfälle
Eingang 1:
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Ausgang 1:
[ 5, 8, 3, 6 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Eingang 2
[[10 20 0 0 0 0],
[0 30 0 40 0 0],
[0 0 50 60 70 0],
[0 0 0 0 0 80]]
Ausgang 2:
[ 10 20 30 40 50 60 70 80 ]
[ 0 2 4 7 8 ]
[ 0 1 1 3 2 3 4 5 ]
Eingang 3:
[[0 0 0],
[0 0 0],
[0 0 0]]
Ausgang 3:
[ ]
[ 0 0 0 0 ]
[ ]
Eingang 4:
[[1 1 1],
[1 1 1],
[1 1 1]]
Ausgang 4:
[ 1 1 1 1 1 1 1 1 1 ]
[ 0 3 6 9 ]
[ 0 1 2 0 1 2 0 1 2 ]
Eingang 5:
[[0 0 0 0],
[5 -9 0 0],
[0 0 0.3 0],
[0 -400 0 0]]
Ausgang 5:
[ 5, -9, 0.3, -400 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Angenommen, Eingaben können eine reelle Zahl enthalten, Sie müssen keine mathematischen Symbole oder Exponentialdarstellungen berücksichtigen (z. B. werden 5.000 niemals als 5e3 eingegeben). Sie werden nicht behandeln müssen inf
, -inf
, NaN
oder andere ‚pseudo-Zahlen‘. Sie können eine andere Darstellung der Zahl ausgeben (5.000 können als 5e3 ausgegeben werden, wenn Sie dies wünschen).
Wertung:
Dies ist ein Code-Golf , der mit den wenigsten Bytes gewinnt.
Bestenlisten
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.
Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
# Perl, 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
quelle
IA[0] = 0
völlig unnötig? Es muss nur definiert werdenIA[i] = IA[i − 1]...
, aber wir können einfach angeben, dass, wenni-1 < 0
0 verwendet wird, IA [0] immer gleich 0 ist, daher kann es komprimiert werden (ja, ich erkenne, dass dies eine Kritik des Algorithmus ist, nicht diese Herausforderung).Antworten:
MATL , 19 Bytes
Eingabe dient
;
als Zeilentrennzeichen.Probieren Sie es online! Oder überprüfen Sie alle Testfälle: 1 , 2 , 3 , 4 , 5 .
Erläuterung
quelle
Mathematica, 78 Bytes
Sehen Sie diese Antwort auf mathematica.stackexchange.com .
quelle
Haskell, 87 Bytes
Probieren Sie es online!
Wie es funktioniert:
quelle
Gelee , 24 Bytes
Probieren Sie es online!
quelle
APL (Dyalog) ,
3128 Zeichen oder3633 Byte *Erfordert eine nullbasierte
⎕IO←0
Indizierung. I / O ist eine Liste von Listen.Probieren Sie es online!
{
…}
Anonyme Funktion, bei der das Argument durch ⍵ dargestellt wird(
...)(
...)(
...)
eine Liste von drei Dingen:⍵≠0
Boolean , wo die Argumentation unterscheidet sich von 0⍸¨
ɩ ndices von denen für jede Unterliste∊
ε nlist (Flatten) in einzelne Liste kombinieren⍵~¨0
Entfernen Nullen von jeder Unterliste des Argumentsd←
speichern , die als d≢¨
jeweils tally+\
kumulative Summe0,
eine Null voranstellen∊d
ϵ nlist (Abflachen) d , um eine einzelne Liste zu erstellen* Um in Dyalog klassisch laufen, einfach ersetzen
⍸
mit⎕U2378
.quelle
f 4 4⍴
und dann die werte?f
. Der Eingang ist wirklich ein REPL, die Anrufef
auf dem Ergebnis4 4⍴…
die r die Daten in eine 4 × 4 - Matrix eshapes.PHP , 107 Bytes
Probieren Sie es online!
PHP , 109 Bytes
Probieren Sie es online!
quelle
$x[]=$v
mit$x[]=+$v
JavaScript (ES6), 117 Byte
Eingabe ist ein 2D-Array von Zahlen und Ausgabe ist ein Array von
[A, IA, JA]
.Erklärt
Tests
Code-Snippet anzeigen
quelle
Python 2 , 115 Bytes
Probieren Sie es online!
Ausgabe ist
[A, JA, IA]
quelle
Perl 6 , 84 Bytes
Probieren Sie es online!
Das Einmatrixargument ist in
$_
..flatmap(*.grep(+*))
Wählt die Nicht-Null-Elemente der gesamten Matrix aus.[\+] .map(+*.grep(+*))
ist die dreieckige Reduzierung der Anzahl der Elemente in jeder Zeile (die einige Sprachen nennenscan
).(0,|...)
Stellt dieser Liste eine Null voran..flat.kv
Erzeugt eine indizierte Liste aller Elemente der Matrix..flatmap: { $^a % .[0] xx ?$^b }
Flatmaps über den Modul jedes Indexes durch die Anzahl der Spalten im Array (.[0]
die Anzahl der Elemente in der ersten Zeile), die vom Element selbst repliziert und als Boolescher Wert interpretiert werden. Das heißt, Elemente ungleich Null werden einmal repliziert, und Elemente ungleich Null werden nullmal repliziert (dh entfernt).quelle
Python + SciPy, 79 Bytes
ich denke, eingebaute waren nicht verboten
Akzeptiert Eingaben im Format
[[0, 0, 0, 0],[5, 8, 0, 0],[0, 0, 3, 0],[0, 6, 0, 0]]
quelle
Japt ,
3127 BytesNimmt Eingaben als Array von Arrays und gibt ein Array von Arrays zurück.
Test it (
-Q
Flag nur zu Visualisierungszwecken)Erläuterung
Implizite Eingabe eines Arrays
U
.[[1,1,1],[1,1,1],[1,1,1]]
Für das erste sub = -Array wird es abgeflacht (
c
)U
und dann gefiltert (f
), wobei alle falschen Elemente (dh Nullen) entfernt werden.[1,1,1,1,1,1,1,1,1]
Wir werden die anderen 2 Sub-Arrays gleichzeitig erstellen, indem wir sie überlagern
U
.Wir bilden jedes Element (Subarray) in ab
U
X
ist das aktuelle Element des aktuellen Sub-Arrays und©
ist logisch AND (&&
). Wenn diesX
nicht der Fall ist (nicht Null), wird der nächste Teil nicht ausgeführt.In Japt gibt
N
es ein Array, das alle Eingaben enthält. Wenn dies derX
Fall ist, verschieben wir (p
) den Index (Y
) des aktuellen Elements nachN
.[[[1,1,1],[1,1,1],[1,1,1]],0,1,2,0,1,2,0,1,2]
Zurück zur Karte des Hauptarrays und für jedes Element (
Z
) erhalten wir die Anzahl der Elemente in diesem Unterarray, die wahr sind (nicht Null).[3,3,3]
Reduzieren Sie dieses Array kumulativ durch Summieren.
[3,6,9]
Fügen Sie (
i
) 0 am Index 0 ein, um das zweite Unterarray zu vervollständigen.[0,3,6,9]
Für das letzte Unterarray schneiden wir einfach
N
vom 1. Element.[0,1,2,0,1,2,0,1,2]
quelle