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
la source
IA[0] = 0
complètement inutile? Il suffit de définirIA[i] = IA[i − 1]...
, mais nous pourrions simplement dire que sii-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).Réponses:
MATL , 19 octets
L'entrée utilise
;
comme séparateur de ligne.Essayez-le en ligne! Ou vérifiez tous les cas de test: 1 , 2 , 3 , 4 , 5 .
Explication
la source
Mathematica, 78 octets
Voir cette réponse sur mathematic.stackexchange.com .
la source
Haskell, 87 octets
Essayez-le en ligne!
Comment ça fonctionne:
la source
Gelée , 24 octets
Essayez-le en ligne!
la source
APL (Dyalog) ,
3128 caractères ou3633 octets *Requiert
⎕IO←0
une indexation à base zéro. I / O est une liste de listes.Essayez-le en ligne!
{
…}
Fonction anonyme où l'argument est représenté par ⍵(
...)(
...)(
...)
retourner une liste de trois choses:⍵≠0
Booléen où l'argument diffère de 0⍸¨
ɩ ndices de ceux de chaque sous-liste∊
ϵ nlist (flatten) à combiner en une seule liste⍵~¨0
supprimer des zéros de chaque sous-liste de l'argumentd←
magasin que d≢¨
tally chaque+\
somme cumulative0,
préfixer un zéro∊d
ε nlist (aplatir) d à combiner en liste unique* Pour exécuter dans Dyalog Classic, remplacez simplement
⍸
par⎕U2378
.la source
f 4 4⍴
puis les valeurs?f
. L'entrée est vraiment un REPL, qui appellef
sur le résultat de4 4⍴…
laquelle r eshapes les données dans une matrice 4 × 4.PHP , 107 octets
Essayez-le en ligne!
PHP , 109 octets
Essayez-le en ligne!
la source
$x[]=$v
par$x[]=+$v
JavaScript (ES6), 117 octets
L'entrée est un tableau 2D de nombres et la sortie est un tableau de
[A, IA, JA]
.Expliqué
Les tests
Afficher l'extrait de code
la source
Python 2 , 115 octets
Essayez-le en ligne!
La sortie est
[A, JA, IA]
la source
Perl 6 , 84 octets
Essayez-le en ligne!
L'argument de matrice unique est dans
$_
..flatmap(*.grep(+*))
sélectionne les éléments non nuls de la matrice entière.[\+] .map(+*.grep(+*))
est la réduction triangulaire du nombre d'éléments dans chaque ligne (que certaines langues appellentscan
).(0,|...)
ajoute un zéro à cette liste..flat.kv
produit une liste indexée de tous les éléments de la matrice..flatmap: { $^a % .[0] xx ?$^b }
flat-maps sur le module de chaque index par le nombre de colonnes du tableau (.[0]
, le nombre d'éléments dans la première ligne), répliqué par l'élément lui-même, interprété comme un booléen. Autrement dit, les éléments non nuls sont répliqués une fois et les éléments nuls sont répliqués zéro fois (c'est-à-dire supprimés).la source
Python + SciPy, 79 octets
je suppose que les éléments intégrés n'étaient pas interdits
Accepte les entrées au format
[[0, 0, 0, 0],[5, 8, 0, 0],[0, 0, 3, 0],[0, 6, 0, 0]]
la source
Japt ,
3127 octetsPrend l'entrée comme un tableau de tableaux et renvoie un tableau de tableaux.
Testez-le (
-Q
indicateur à des fins de visualisation uniquement)Explication
Entrée implicite du tableau
U
.[[1,1,1],[1,1,1],[1,1,1]]
Pour le premier sous-tableau =, nous l'aplatissons (
c
)U
puis lef
filtrons ( ), en supprimant tous les éléments de falsey (c.-à-d., 0s)[1,1,1,1,1,1,1,1,1]
Nous allons construire les 2 autres sous-tableaux en même temps, en mappant dessus
U
.Nous cartographions chaque élément (sous-tableau) dans
U
X
est l'élément courant du sous-tableau courant et©
est un ET logique (&&
) donc, s'ilX
n'est pas véridique (pas nul), la partie suivante ne sera pas exécutée.Dans Japt,
N
est un tableau contenant toutes les entrées donc ici, siX
c'est vrai, nous poussons (p
) l'index (Y
) de l'élément courant versN
.[[[1,1,1],[1,1,1],[1,1,1]],0,1,2,0,1,2,0,1,2]
Revenons à la carte du tableau principal et, pour chaque élément (
Z
), nous obtenons le nombre d'éléments dans ce sous-tableau qui sont véridiques (et non nuls).[3,3,3]
Réduisez cumulativement ce tableau en sommant.
[3,6,9]
Insérez (
i
) 0 à l'index 0 pour terminer le deuxième sous-tableau.[0,3,6,9]
Pour le sous-tableau final, nous découpons simplement à
N
partir du 1er élément.[0,1,2,0,1,2,0,1,2]
la source