Comprima uma matriz esparsa usando a linha esparsa compactada (formato CSR, CRS ou Yale) .
Essas são todas as mesmas formas de compactação (ignore a nova Yale).
A entrada pode ser qualquer estrutura de dados 2D (lista de listas, etc.): por exemplo
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
E a saída deverá ser de três estruturas de dados (lista 1d etc), que denotam as saídas A
, IA
e JA
, por exemplo
[5, 8, 3, 6]
[0, 0, 2, 3, 4]
[0, 1, 2, 1,]
O processo é descrito pela wikipedia:
A matriz A tem o comprimento NNZ e mantém todas as entradas diferentes de zero de M na ordem da esquerda para a direita, de cima para baixo ("linha principal").
A matriz IA é de comprimento m + 1. É definida por esta definição recursiva:
IA [0] = 0 IA [i] = IA [i - 1] + (número de elementos diferentes de zero na (i - 1) -a linha na matriz original)
Assim, os primeiros m elementos de IA armazenam o índice em A do primeiro elemento diferente de zero em cada linha de M, e o último elemento IA [m] armazena NNZ, o número de elementos em A, que também pode ser considerado o índice em A do primeiro elemento de uma linha fantasma logo após o final da matriz M. Os valores da i-ésima linha da matriz original são lidos a partir dos elementos A [IA [i]] a A [IA [i + 1] - 1] (inclusive nos dois extremos), ou seja, do início de uma linha ao último índice, pouco antes do início da próxima. [5]
A terceira matriz, JA, contém o índice da coluna em M de cada elemento de A e, portanto, também é de comprimento NNZ.
Se o seu idioma não suportar estruturas de dados reais, entrada e saída podem ser texto.
Casos de teste
Entrada 1:
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Saída 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]]
Saída 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]]
Saída 3:
[ ]
[ 0 0 0 0 ]
[ ]
Entrada 4:
[[1 1 1],
[1 1 1],
[1 1 1]]
Saída 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]]
Saída 5:
[ 5, -9, 0.3, -400 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Suponha que as entradas possam conter qualquer número real; você não precisa considerar símbolos matemáticos ou representação exponencial (por exemplo, 5.000 nunca serão inseridos como 5e3). Você não vai precisar para lidar com inf
, -inf
, NaN
ou quaisquer outros 'pseudo-números'. Você pode emitir uma representação diferente do número (5.000 pode ser emitido como 5e3, se assim desejar).
Pontuação:
Este é um código-golfe , o menor número de bytes vence.
Classificação
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
# Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet da tabela de classificação:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
IA[0] = 0
completamente desnecessário? É apenas necessário definir IA[i] = IA[i − 1]...
, mas poderíamos simplesmente afirmar que, se i-1 < 0
usar 0. Ou seja, IA [0] é sempre igual a 0, portanto, pode ser compactado (sim, eu percebo que isso é uma crítica ao algoritmo, não esse desafio).