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
fuente
IA[0] = 0
completamente innecesario? Solo es necesario definirIA[i] = IA[i − 1]...
, sin embargo, podríamos simplemente decir que si sei-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).Respuestas:
MATL , 19 bytes
La entrada se usa
;
como separador de filas.Pruébalo en línea! O verifique todos los casos de prueba: 1 , 2 , 3 , 4 , 5 .
Explicación
fuente
Mathematica, 78 bytes
Vea esta respuesta en Mathica.stackexchange.com .
fuente
Haskell, 87 bytes
Pruébalo en línea!
Cómo funciona:
fuente
Jalea , 24 bytes
Pruébalo en línea!
fuente
APL (Dyalog) ,
3128 caracteres o3633 bytes *Requiere
⎕IO←0
para indexación basada en cero. I / O es una lista de listas.Pruébalo en línea!
{
...}
función anónima donde el argumento está representado por ⍵(
...)(
...)(
...)
devuelve una lista de tres cosas:⍵≠0
Booleano donde el argumento difiere de 0⍸¨
ɩ ndices de aquellos para cada sublista∊
ϵ nlist (flatten) para combinar en una sola lista⍵~¨0
eliminar los ceros de cada sub-lista del argumentod←
tienda que como d≢¨
recuento de cada+\
suma acumulada0,
anteponer un cero∊d
ε nlist (aplanar) d de combinar en una sola lista* Para ejecutar en Dyalog Classic, simplemente reemplácelo
⍸
con⎕U2378
.fuente
f 4 4⍴
y luego los valores?f
. La entrada es realmente un REPL, que llamaf
en el resultado de4 4⍴…
la cual r eshapes los datos en una matriz de 4 × 4.PHP , 107 bytes
Pruébalo en línea!
PHP , 109 bytes
Pruébalo en línea!
fuente
$x[]=$v
con$x[]=+$v
JavaScript (ES6), 117 bytes
La entrada es una matriz 2D de números y la salida es una matriz de
[A, IA, JA]
.Explicado
Pruebas
Mostrar fragmento de código
fuente
Python 2 , 115 bytes
Pruébalo en línea!
La salida es
[A, JA, IA]
fuente
Perl 6 , 84 bytes
Pruébalo en línea!
El argumento de matriz única está en
$_
..flatmap(*.grep(+*))
selecciona los elementos distintos de cero de toda la matriz.[\+] .map(+*.grep(+*))
es la reducción triangular del número de elementos en cada fila (que algunos idiomas llamanscan
).(0,|...)
antepone un cero a esa lista..flat.kv
produce una lista indexada de todos los elementos de la matriz..flatmap: { $^a % .[0] xx ?$^b }
mapas planos sobre el módulo de cada índice por el número de columnas en la matriz (.[0]
, el número de elementos en la primera fila), replicado por el elemento mismo, interpretado como un booleano. Es decir, los elementos distintos de cero se replican una vez, y los elementos cero se replican cero veces (es decir, se eliminan).fuente
Python + SciPy, 79 bytes
Supongo que las incorporaciones no estaban prohibidas
Acepta entradas en el formato
[[0, 0, 0, 0],[5, 8, 0, 0],[0, 0, 3, 0],[0, 6, 0, 0]]
fuente
Japt ,
3127 bytesToma datos como una matriz de matrices y devuelve una matriz de matrices.
Pruébalo (
-Q
marca solo con fines de visualización)Explicación
Entrada implícita de la matriz
U
.[[1,1,1],[1,1,1],[1,1,1]]
Para el primer sub = -array, aplanamos (
c
)U
y luego lo filtramos (f
), eliminando cualquier elemento falsey (es decir, 0s)[1,1,1,1,1,1,1,1,1]
Vamos a construir los otros 2 sub-arrays al mismo tiempo, mapeando
U
.Mapeamos sobre cada elemento (sub-matriz) en
U
X
es el elemento actual del subarreglo actual y©
es lógico AND (&&
), por lo tanto, siX
no es verdadero (no cero), la siguiente parte no se ejecutará.En Japt,
N
es una matriz que contiene todas las entradas, por lo que aquí, siX
es verdad, empujamos (p
) el índice (Y
) del elemento actual aN
.[[[1,1,1],[1,1,1],[1,1,1]],0,1,2,0,1,2,0,1,2]
Volviendo al mapa de la matriz principal y, para cada elemento (
Z
), obtenemos el recuento de elementos en esa sub-matriz que son verdaderos (no cero).[3,3,3]
Reduzca acumulativamente esta matriz sumando.
[3,6,9]
Inserte (
i
) 0 en el índice 0 para completar la segunda sub-matriz.[0,3,6,9]
Para la submatriz final, simplemente cortamos
N
del primer elemento.[0,1,2,0,1,2,0,1,2]
fuente