Comprimi una matrice sparsa usando la riga sparsa compressa (formato CSR, CRS o Yale) .
Questi sono tutti la stessa forma di compressione (ignora il nuovo Yale).
L'input può essere qualsiasi struttura di dati 2d (elenco di elenchi, ecc.): Ad es
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
E l'uscita dovrebbe essere tre strutture dati 1d (elenco etc), che indicano le uscite A
, IA
e JA
, per esempio
[5, 8, 3, 6]
[0, 0, 2, 3, 4]
[0, 1, 2, 1,]
Il processo è descritto da Wikipedia:
La matrice A è di lunghezza NNZ e contiene tutte le voci diverse da M in ordine da sinistra a destra dall'alto verso il basso ("riga maggiore").
L'array IA è di lunghezza m + 1. È definito da questa definizione ricorsiva:
IA [0] = 0 IA [i] = IA [i - 1] + (numero di elementi diversi da zero sulla riga (i - 1) nella matrice originale)
Pertanto, i primi m elementi di IA memorizzano l'indice in A del primo elemento diverso da zero in ciascuna riga di M e l'ultimo elemento IA [m] memorizza NNZ, il numero di elementi in A, che può anche essere considerato come il indice in A del primo elemento di una riga fantasma appena oltre la fine della matrice M. I valori dell'i-esima riga della matrice originale vengono letti dagli elementi da A [IA [i]] a A [IA [i + 1] - 1] (inclusivo su entrambe le estremità), ovvero dall'inizio di una riga all'ultimo indice appena prima dell'inizio del successivo. [5]
Il terzo array, JA, contiene l'indice di colonna in M di ciascun elemento di A e quindi è anch'esso di lunghezza NNZ.
Se la tua lingua non supporta le strutture dati effettive, l'input e l'output potrebbero essere di testo.
Casi test
Ingresso 1:
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Uscita 1:
[ 5, 8, 3, 6 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Ingresso 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]]
Uscita 2:
[ 10 20 30 40 50 60 70 80 ]
[ 0 2 4 7 8 ]
[ 0 1 1 3 2 3 4 5 ]
Ingresso 3:
[[0 0 0],
[0 0 0],
[0 0 0]]
Uscita 3:
[ ]
[ 0 0 0 0 ]
[ ]
Ingresso 4:
[[1 1 1],
[1 1 1],
[1 1 1]]
Uscita 4:
[ 1 1 1 1 1 1 1 1 1 ]
[ 0 3 6 9 ]
[ 0 1 2 0 1 2 0 1 2 ]
Ingresso 5:
[[0 0 0 0],
[5 -9 0 0],
[0 0 0.3 0],
[0 -400 0 0]]
Uscita 5:
[ 5, -9, 0.3, -400 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Supponiamo che gli input possano contenere qualsiasi numero reale, non è necessario prendere in considerazione simboli matematici o rappresentazione esponenziale (ad es. 5.000 non verranno mai inseriti come 5e3). Non avrete bisogno di gestire inf
, -inf
, NaN
o di qualsiasi altro 'pseudo-numeri'. È possibile produrre una diversa rappresentazione del numero (5.000 possono essere emessi come 5e3, se lo si desidera).
punteggio:
Questo è un codice-golf , vince meno byte.
Classifiche
Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.
Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, utilizzando il seguente modello Markdown:
# Language Name, N bytes
dov'è N
la dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:
# Perl, 43 + 2 (-p flag) = 45 bytes
Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
IA[0] = 0
tutto inutile? È necessario solo definire IA[i] = IA[i − 1]...
, ma potremmo semplicemente affermare che se i-1 < 0
usare 0. Cioè, IA [0] è sempre uguale a 0, quindi può essere compresso (sì, mi rendo conto che questa è una critica dell'algoritmo, non questa sfida).