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
fonte
IA[0] = 0
completamente desnecessário? É apenas necessário definirIA[i] = IA[i − 1]...
, mas poderíamos simplesmente afirmar que, sei-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).Respostas:
MATL , 19 bytes
A entrada é usada
;
como separador de linhas.Experimente online! Ou verifique todos os casos de teste: 1 , 2 , 3 , 4 , 5 .
Explicação
fonte
Mathematica, 78 bytes
Veja esta resposta em mathematica.stackexchange.com .
fonte
Haskell, 87 bytes
Experimente online!
Como funciona:
fonte
Gelatina , 24 bytes
Experimente online!
fonte
APL (Dyalog) ,
3128 caracteres ou3633 bytes *Requer
⎕IO←0
indexação baseada em zero. E / S é uma lista de listas.Experimente online!
{
…}
Função anônima em que o argumento é representado por ⍵(
...)(
...)(
...)
retornar uma lista de três coisas:⍵≠0
Booleano onde o argumento difere de 0⍸¨
d ndices daqueles para cada sublist∊
ϵ nlist (flatten) para combinar em uma lista única⍵~¨0
remover zeros de cada sub-lista de argumento ad←
loja que como d≢¨
contagem cada+\
soma cumulativa0,
preceder um zero∊d
ε nlist (flatten) d para combinar em lista única* Para executar no Dyalog Classic, basta substituir
⍸
por⎕U2378
.fonte
f 4 4⍴
e então os valores?f
. A entrada é realmente um REPL, que chamaf
sobre o resultado de4 4⍴…
que r eshapes os dados em uma matriz 4 × 4.PHP , 107 bytes
Experimente online!
PHP , 109 bytes
Experimente online!
fonte
$x[]=$v
por$x[]=+$v
JavaScript (ES6), 117 bytes
A entrada é uma matriz 2D de números e a saída é uma matriz de
[A, IA, JA]
.Explicado
Testes
Mostrar snippet de código
fonte
Python 2 , 115 bytes
Experimente online!
Saída é
[A, JA, IA]
fonte
Perl 6 , 84 bytes
Experimente online!
O argumento de matriz única está em
$_
..flatmap(*.grep(+*))
seleciona os elementos diferentes de zero de toda a matriz.[\+] .map(+*.grep(+*))
é a redução triangular do número de elementos em cada linha (que alguns idiomas chamamscan
).(0,|...)
acrescenta um zero a essa lista..flat.kv
produz uma lista indexada de todos os elementos da matriz..flatmap: { $^a % .[0] xx ?$^b }
mapeia o módulo de cada índice pelo número de colunas na matriz (.[0]
o número de elementos na primeira linha), replicado pelo próprio elemento, interpretado como booleano. Ou seja, elementos diferentes de zero são replicados uma vez e zero elementos são replicados zero vezes (ou seja, removidos).fonte
Python + SciPy, 79 bytes
Eu acho que embutidos não eram proibidos
Aceita entrada no formato
[[0, 0, 0, 0],[5, 8, 0, 0],[0, 0, 3, 0],[0, 6, 0, 0]]
fonte
Japonês ,
3127 bytesRecebe a entrada como uma matriz de matrizes e retorna uma matriz de matrizes.
Teste (
-Q
sinalize apenas para fins de visualização)Explicação
Entrada implícita da matriz
U
.[[1,1,1],[1,1,1],[1,1,1]]
Para o primeiro sub = -array, aplainamos (
c
)U
e depois filtramos (f
), removendo quaisquer elementos falsey (ou seja, 0s)[1,1,1,1,1,1,1,1,1]
Vamos construir as outras duas sub-matrizes ao mesmo tempo, mapeando
U
.Mapeamos sobre cada elemento (sub-matriz) em
U
X
é o elemento atual do subconjunto atual e©
é lógico AND (&&
), portanto, seX
não for verdade (não zero), a próxima parte não será executada.Em Japt,
N
é uma matriz que contém todas as entradas; portanto, seX
for verdade, pressionamos (p
) o índice (Y
) do elemento atual paraN
.[[[1,1,1],[1,1,1],[1,1,1]],0,1,2,0,1,2,0,1,2]
De volta ao mapa da matriz principal e, para cada elemento (
Z
), obtemos a contagem de elementos nessa sub-matriz que são verdadeiros (não zero).[3,3,3]
Reduza cumulativamente essa matriz somando.
[3,6,9]
Insira (
i
) 0 no índice 0 para concluir a segunda sub-matriz.[0,3,6,9]
Para o subconjunto final, simplesmente cortamos
N
o primeiro elemento.[0,1,2,0,1,2,0,1,2]
fonte