Escribe un programa para resolver una serie de ecuaciones lineales lo más cortas posible. Debe resolver un número arbitrario de problemas de ecuaciones. Pueden ingresar lo que desee, los coeficientes de matriz aumentada son probablemente los más fáciles. El programa no tiene que manejar coeficientes o soluciones no enteros. No se probarán casos degenerados o inválidos. El programa debe generar el valor de cada variable o forma de escalón de fila reducida.
No se permiten bibliotecas de resolución de ecuaciones, funciones matriciales ni ninguna forma de resolver automáticamente. Puede simular matrices con matrices o listas.
Entrada de ejemplo (o equivalente):
m={{2,1,-1,8},{-3,-1,2,-11},{-2,1,2,-3}}
Esto representa 2x+y-z=8, -3x-y+2z=-11, -2x+y+2z=-3
Ejemplo de salida (o equivalente):
{2,3,-1}
Esto representa x=2, y=3, z=-1
0x=0
o0x=5
; 4) Casos donde el número de ecuaciones es diferente al número de variables; 5) Casos contradictorios comox+5y=7, x+5y=8
; 6) Casos sin independencia lineal, comox+3y=6, 2x+6y=12
. Estoy en lo cierto?Respuestas:
Python
169166Implementación
Manifestación
Nota
Si está de acuerdo con la aproximación de flotación, puede eliminar la llamada a la función de redondeo y seguir jugando golf a 159 caracteres
fuente
APL, 1 char
Sé que no cumple con los requisitos (revisados), pero es demasiado bueno para no publicar:
El símbolo "dominó"
⌹
(división÷
dentro de un rectángulo) realiza la división matricial, por lo tanto, puede resolver cualquier sistema de ecuaciones lineales. Solo tiene que ponerlo entre el término constante vector y la matriz con los otros términos:(si quieres probarlo en TryApl,
⊃
es↑
)fuente
Javascript (
284181) - Método de eliminación de GaussPrueba
La matriz devuelta combina la matriz de identidad y la solución.
fuente
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]
dentrofor()
y saltar{}
alrededor.Esta respuesta ya no se ajusta a la pregunta después del cambio de regla, ya que utiliza una función matricial. * *
Sabio , 32
Entrada de muestra:
Salida de muestra:
* Podría decirse que
matrix()
es una conversión tipográfica, no una función (la ejecuciónimport types; isinstance(matrix, types.FunctionType)
daFalse
). Además, los~
y*
son operadores , no funciones.fuente
Java -
522434228213 caracteresResuelve comprobando sistemáticamente todas las n-tuplas enteras posibles mediante multiplicación directa hasta que se encuentre una que funcione.
La función toma matriz aumentada, A, vector de solución de prueba, x, y dimensión, n, como vector de solución de entrada - salida, x. Tenga en cuenta que el vector x es en realidad uno más grande que la dimensión para ayudar a analizar posibles soluciones. (Si declarara las variables A, x, n, j, k, s como variables de instancia, la función sería 31 caracteres más corta, para un total de 182, pero eso parece doblar las reglas demasiado lejos).
Programa de prueba (algo no golfista):
El programa toma la entrada de stdin como enteros separados por espacios de la siguiente manera: primero, la dimensión del problema, segundo, las entradas de la matriz aumentada por fila.
Ejecución de muestra:
Afeité varios caracteres siguiendo los consejos de Victor sobre bucles y "público", almacenando el RHS en la matriz aumentada en lugar de por separado, y agregando una entrada adicional a mi solución de prueba para simplificar la generación de cada nueva solución de prueba. El OP también dijo que una función es suficiente, no es necesario contar todo el programa.
fuente
while(true){f=0;for(j=0;j<n;j++)
puede ser sustituido porwhile(true){for(f=j=0;j<n;j++)
. Además, tu clase no necesita ser pública. Los bucles for con una sola instrucción en el cuerpo no necesitan llaves.for(j=0;j<n;j++){for(k=0;k<n;k++){A[j][k]=p.nextInt();}b[j]=p.nextInt();}
puede ser reemplazado porfor(j=0;j<n;b[j++]=p.nextInt())for(k=0;k<n;)A[j][k++]=p.nextInt();
while(true)
se puede cambiar afor(;;)
JavaScript (ES6),
152151 bytesImplementación de la regla de Cramer .
(m)(v)
Pruébalo en línea!
fuente