Comprima una matriz dispersa utilizando la fila dispersa comprimida (formato CSR, CRS o Yale) .
Estas son todas la misma forma de compresión (ignore el nuevo Yale).
La entrada puede ser cualquier estructura de datos 2D (lista de listas, etc.): por ejemplo
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Y la salida debe ser de tres estructuras de datos (lista 1d, etc), que denotan las salidas A
, IA
y JA
, por ejemplo,
[5, 8, 3, 6]
[0, 0, 2, 3, 4]
[0, 1, 2, 1,]
El proceso es descrito por wikipedia:
La matriz A tiene una longitud NNZ y contiene todas las entradas distintas de cero de M en orden de izquierda a derecha de arriba a abajo ("fila mayor").
La matriz IA tiene una longitud m + 1. Se define mediante esta definición recursiva:
IA [0] = 0 IA [i] = IA [i - 1] + (número de elementos distintos de cero en la fila (i - 1) en la matriz original)
Por lo tanto, los primeros m elementos de IA almacenan el índice en A del primer elemento distinto de cero en cada fila de M, y el último elemento IA [m] almacena NNZ, el número de elementos en A, que también puede considerarse como el índice en A del primer elemento de una fila fantasma justo más allá del final de la matriz M. Los valores de la fila i-ésima de la matriz original se leen desde los elementos A [IA [i]] a A [IA [i + 1] - 1] (inclusive en ambos extremos), es decir, desde el inicio de una fila hasta el último índice justo antes del inicio de la siguiente. [5]
La tercera matriz, JA, contiene el índice de columna en M de cada elemento de A y, por lo tanto, también tiene una longitud NNZ.
Si su idioma no admite estructuras de datos reales, la entrada y la salida pueden ser texto.
Casos de prueba
Entrada 1:
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Salida 1:
[ 5, 8, 3, 6 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Entrada 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]]
Salida 2:
[ 10 20 30 40 50 60 70 80 ]
[ 0 2 4 7 8 ]
[ 0 1 1 3 2 3 4 5 ]
Entrada 3:
[[0 0 0],
[0 0 0],
[0 0 0]]
Salida 3:
[ ]
[ 0 0 0 0 ]
[ ]
Entrada 4:
[[1 1 1],
[1 1 1],
[1 1 1]]
Salida 4:
[ 1 1 1 1 1 1 1 1 1 ]
[ 0 3 6 9 ]
[ 0 1 2 0 1 2 0 1 2 ]
Entrada 5:
[[0 0 0 0],
[5 -9 0 0],
[0 0 0.3 0],
[0 -400 0 0]]
Salida 5:
[ 5, -9, 0.3, -400 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Suponga que las entradas pueden contener cualquier número real, no necesita considerar símbolos matemáticos o representación exponencial (por ejemplo, 5,000 nunca se ingresarán como 5e3). Usted no tendrá que manejar inf
, -inf
, NaN
o cualquier otro 'pseudo-números'. Puede generar una representación diferente del número (5,000 se pueden generar como 5e3 si así lo desea).
Puntuación:
Este es un código de golf , menos bytes gana.
Tablas de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntuación, se puede mantener viejas cuentas en el título, golpeándolos a través. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
IA[0] = 0
completamente innecesario? Solo es necesario definir IA[i] = IA[i − 1]...
, sin embargo, podríamos simplemente decir que si se i-1 < 0
usa 0. Es decir, IA [0] siempre es igual a 0, por lo tanto, se puede comprimir (sí, me doy cuenta de que esto es una crítica del algoritmo, No este desafío).