Escreva um programa para resolver uma série de equações lineares o mais curta possível. Ele deve resolver problemas arbitrários de número de equações. Eles podem ser inseridos da maneira que você quiser; os coeficientes da matriz aumentada são provavelmente os mais fáceis. O programa não precisa lidar com coeficientes ou números não inteiros. Nenhum caso degenerado ou inválido será testado. O programa deve gerar o valor de cada variável ou formulário de escalão de linha reduzido.
Nenhuma biblioteca de solução de equações, funções de matriz ou qualquer maneira de resolver automaticamente é permitida. Você pode simular matrizes com matrizes ou listas.
Exemplo de entrada (ou equivalente):
m={{2,1,-1,8},{-3,-1,2,-11},{-2,1,2,-3}}
Isto representa 2x+y-z=8, -3x-y+2z=-11, -2x+y+2z=-3
Exemplo de saída (ou equivalente):
{2,3,-1}
Isto representa x=2, y=3, z=-1
0x=0
ou0x=5
; 4) Casos em que o número de equações é diferente do número de variáveis; 5) Casos contraditórios comox+5y=7, x+5y=8
; 6) Casos sem independência linear, comox+3y=6, 2x+6y=12
. Estou certo?Respostas:
Python
169166Implementação
Demo
Nota
Se você estiver bem com a aproximação de flutuação, poderá remover a chamada de função redonda e aumentar o golfe para 159 caracteres
fonte
APL, 1 caracter
Sei que não se encaixa nos requisitos (revisados), mas é bom demais para não postar:
O símbolo "dominó"
⌹
(divisão÷
dentro de um retângulo) realiza a divisão matricial, portanto, pode resolver qualquer sistema de equações lineares. Você apenas precisa colocá-lo entre o vetor de termo constante e a matriz com os outros termos:(se você quiser experimentá-lo no TryApl,
⊃
é↑
)fonte
Javascript (
284181) - Método de eliminação de GaussTeste
A matriz retornada combina a matriz de identidade e a solução.
fonte
l=A.length;for(i=0;i<l;i++)
usarfor(i=0;i<l=A.length;i++)
.for(i=l-1;i>=0;i--)
usarfor(i=l;--i;)
.w=A[j][i]
entrarfor()
e pular{}
.Essa resposta não se encaixa mais na pergunta após a alteração da regra, pois usa uma função de matriz. *
Sage , 32
Entrada de amostra:
Saída de amostra:
* Indiscutivelmente,
matrix()
é um typecast, não uma função (a execuçãoimport types; isinstance(matrix, types.FunctionType)
dáFalse
). Além disso, os operadores~
e*
são , não funções.fonte
Java -
522434228213 caracteresResolve verificando sistematicamente todas as n-tuplas inteiras possíveis por multiplicação direta até encontrar um que funcione.
A função assume matriz aumentada, A, vetor de solução de teste, x, e dimensão, n, como vetor de solução de entrada e saída, x. Observe que o vetor x é na verdade um maior que a dimensão para ajudar a percorrer as possíveis soluções. (Se eu declarasse as variáveis A, x, n, j, k, s como variáveis de instância, a função seria 31 caracteres menor - para um total de 182, mas isso parece inclinar muito as regras.)
Programa para teste (um pouco não-destruído):
O programa recebe a entrada do stdin como números inteiros separados por espaço, como segue: primeiro, a dimensão do problema, segundo, as entradas da matriz aumentada por linha.
Exemplo de execução:
Raspei vários caracteres seguindo o conselho de Victor sobre loops e "público", armazenando o RHS na matriz aumentada em vez de separadamente e adicionando uma entrada extra à minha solução de teste para simplificar a geração de cada nova solução de teste. O OP também disse que uma função é suficiente - não é necessário contar o programa inteiro.
fonte
while(true){f=0;for(j=0;j<n;j++)
pode ser substituído porwhile(true){for(f=j=0;j<n;j++)
. Além disso, sua turma não precisa ser pública. For-loops com apenas uma instrução no corpo não precisam de chaves.for(j=0;j<n;j++){for(k=0;k<n;k++){A[j][k]=p.nextInt();}b[j]=p.nextInt();}
pode ser substituído porfor(j=0;j<n;b[j++]=p.nextInt())for(k=0;k<n;)A[j][k++]=p.nextInt();
while(true)
pode ser alterado parafor(;;)
JavaScript (ES6),
152151 bytesImplementação da regra de Cramer .
(m)(v)
Experimente online!
fonte