Compressez une matrice clairsemée à l'aide d' une ligne clairsemée compressée (format CSR, CRS ou Yale) .
Ce sont tous la même forme de compression (ignorez le nouveau Yale).
L'entrée peut être n'importe quelle structure de données 2D (liste de listes, etc.): par exemple
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Et la sortie doit être trois structures de données 1d (liste, etc.), qui désignent les sorties A
, IA
et JA
, par exemple
[5, 8, 3, 6]
[0, 0, 2, 3, 4]
[0, 1, 2, 1,]
Le processus est décrit par wikipedia:
Le tableau A est de longueur NNZ et contient toutes les entrées non nulles de M dans l'ordre de gauche à droite de haut en bas ("row-major").
Le tableau IA est de longueur m + 1. Il est défini par cette définition récursive:
IA [0] = 0 IA [i] = IA [i - 1] + (nombre d'éléments non nuls sur la (i - 1) -ième ligne de la matrice d'origine)
Ainsi, les m premiers éléments de IA stockent l'index dans A du premier élément non nul dans chaque ligne de M, et le dernier élément IA [m] stocke NNZ, le nombre d'éléments dans A, qui peut également être considéré comme le index dans A du premier élément d'une ligne fantôme juste au-delà de la fin de la matrice M. Les valeurs de la i-ème ligne de la matrice d'origine sont lues à partir des éléments A [IA [i]] à A [IA [i + 1] - 1] (inclus aux deux extrémités), c'est-à-dire du début d'une ligne au dernier index juste avant le début de la suivante. [5]
Le troisième tableau, JA, contient l'indice de colonne en M de chaque élément de A et est donc également de longueur NNZ.
Si votre langue ne prend pas en charge les structures de données réelles, l'entrée et la sortie peuvent être du texte.
Cas de test
Entrée 1:
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Sortie 1:
[ 5, 8, 3, 6 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Entrée 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]]
Sortie 2:
[ 10 20 30 40 50 60 70 80 ]
[ 0 2 4 7 8 ]
[ 0 1 1 3 2 3 4 5 ]
Entrée 3:
[[0 0 0],
[0 0 0],
[0 0 0]]
Sortie 3:
[ ]
[ 0 0 0 0 ]
[ ]
Entrée 4:
[[1 1 1],
[1 1 1],
[1 1 1]]
Sortie 4:
[ 1 1 1 1 1 1 1 1 1 ]
[ 0 3 6 9 ]
[ 0 1 2 0 1 2 0 1 2 ]
Entrée 5:
[[0 0 0 0],
[5 -9 0 0],
[0 0 0.3 0],
[0 -400 0 0]]
Résultat 5:
[ 5, -9, 0.3, -400 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Supposons que les entrées peuvent contenir n'importe quel nombre réel, vous n'avez pas besoin de considérer les symboles mathématiques ou la représentation exponentielle (par exemple, 5000 ne seront jamais entrés comme 5e3). Vous aurez pas besoin de gérer inf
, -inf
, NaN
ou tout autre « pseudo-numéros ». Vous pouvez générer une représentation différente du nombre (5 000 peuvent être générés en 5e3 si vous le souhaitez).
Notation:
Il s'agit d'un code-golf , le moins d'octets gagne.
Classements
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
IA[0] = 0
complètement inutile? Il suffit de définir IA[i] = IA[i − 1]...
, mais nous pourrions simplement dire que si i-1 < 0
vous utilisez 0. Autrement dit, IA [0] est toujours égal à 0, il peut donc être compressé (oui, je me rends compte que c'est une critique de l'algorithme, pas ce défi).