O objetivo deste desafio é criar um programa que absorva uma matriz e produza sua forma reduzida de escalão de linha.
Uma matriz está na forma de escalão de linha reduzido se atender a todas as seguintes condições:
- Se houver uma linha em que cada entrada seja zero, essa linha ficará abaixo de qualquer outra linha que contenha uma entrada diferente de zero.
- A entrada diferente de zero à esquerda de uma linha é igual a
1
.- A entrada diferente de zero à esquerda de uma linha é a única entrada diferente de zero em sua coluna.
- Considere quaisquer duas entradas diferentes que não sejam zero à esquerda, uma localizada na linha i, coluna j e a outra localizada na linha s, coluna t. Se
s>i
entãot>j
.
O processo geral para transformar a matriz é:
- Lide com cada linha i de 1 a n por sua vez, e trabalhe nas colunas j de 1 a m pulando qualquer coluna de todas as zero entradas.
- Encontre a próxima coluna j com uma entrada diferente de zero.
- Troque linhas, se necessário, para que o elemento dinâmico A (i, j) seja diferente de zero.
- Torne o pivô igual a 1, dividindo cada elemento na linha de pivô pelo valor do pivô.
- Torne todos os elementos acima e abaixo do pivô iguais a 0, subtraindo um múltiplo adequado da linha do pivô.
- Repita para todas as linhas.
Se você quiser ler mais sobre esse tipo de matriz, consulte o artigo da Wikipedia sobre ele e uma ferramenta e artigo (etapas acima) que mostram as etapas para transformar a matriz.
Quanto ao desafio real, aqui está:
A entrada pode ser dada da maneira que você desejar através do STDIN ou equivalente, apenas explique-o na sua resposta. A saída será a forma reduzida de escalão de linha da entrada da mesma forma que a entrada por STDOUT ou equivalente. Brechas padrão não são permitidos e bibliotecas ou funções que fazem esta tarefa externas também não são permitidos ( TI-BASIC
's rref(
comando, por exemplo). Você pode escrever um programa ou função completo. Este é o código de golfe, o menor BYTES vence. Boa sorte!
Exemplo de entrada: [[2,1,1,14][-1,-3,2,-2][4,-6,3,-5]]
Saída de exemplo: [[1,0,0,1][0,1,0,5][0,0,1,7]]
fonte
method(ref(matrix))
, então eu diria que ir em frenteRespostas:
R, 232 bytes
Esta é apenas uma implementação do algoritmo de eliminação gaussiano usual.
Ungolfed:
fonte
M[c(i,r),]=M[c(r,i),]
em vez det=M[i,];M[i,]=M[r,];M[r,]=t