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
IA[0] = 0
völlig unnötig? Es muss nur definiert werden IA[i] = IA[i − 1]...
, aber wir können einfach angeben, dass, wenn i-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).