Напишите программу для решения серии линейных уравнений как можно короче. Это должно решить произвольное число задач уравнений. Они могут быть введены как угодно, коэффициенты расширенной матрицы, вероятно, самые простые. Программа не должна обрабатывать нецелые коэффициенты или решения. Никакие вырожденные или недействительные случаи не будут проверены. Программа должна вывести значение каждой переменной или уменьшенную форму ряда строк.
Никакие библиотеки решения уравнений, матричные функции или любые другие способы автоматического решения не допускаются. Вы можете моделировать матрицы с массивами или списками.
Пример ввода (или эквивалент):
m={{2,1,-1,8},{-3,-1,2,-11},{-2,1,2,-3}}
Это представляет 2x+y-z=8, -3x-y+2z=-11, -2x+y+2z=-3
Пример вывода (или эквивалент):
{2,3,-1}
Это представляет x=2, y=3, z=-1
0x=0
или0x=5
; 4) случаи, когда число уравнений отличается от числа переменных; 5) противоречивые случаи типаx+5y=7, x+5y=8
; 6) Случаи без линейной независимости, вродеx+3y=6, 2x+6y=12
. Я прав?Ответы:
Python
169166Реализация
демонстрация
Запись
Если у вас все в порядке с приближением с плавающей точкой, вы можете убрать вызов функции раунда и еще один гольф до 159 символов.
источник
APL, 1 символ
Я знаю, что это не соответствует (пересмотренным) требованиям, но слишком хорошо, чтобы не публиковать:
Символ «домино»
⌹
(деление÷
внутри прямоугольника) выполняет матричное деление, поэтому он может решать любую систему линейных уравнений. Вам просто нужно поместить его между вектором постоянного члена и матрицей с другими членами:(если вы хотите попробовать это на TryApl,
⊃
есть↑
)источник
Javascript (
284181) - метод исключения ГауссаТестовое задание
Возвращенный массив объединяет единичную матрицу и решение.
источник
l=A.length;for(i=0;i<l;i++)
использованияfor(i=0;i<l=A.length;i++)
.for(i=l-1;i>=0;i--)
использованияfor(i=l;--i;)
.w=A[j][i]
вfor()
и пропустить{}
вокруг.Этот ответ больше не соответствует вопросу после изменения правила, поскольку он использует матричную функцию. *
Шалфей , 32
Пример ввода:
Пример вывода:
* Возможно,
matrix()
это тип-трансакция, а не функция (выполнениеimport types; isinstance(matrix, types.FunctionType)
даетFalse
). Кроме того,~
и*
являются операторами , а не функциями.источник
Ява -
522434228213 символовРешается путем систематической проверки всех возможных целочисленных n-кортежей прямым умножением, пока не будет найдено, что это работает.
Функция принимает расширенную матрицу A, вектор пробного решения, x и размерность n, в качестве вектора ввода-вывода, x. Обратите внимание, что вектор x на самом деле больше, чем размерность, чтобы помочь пройти через возможные решения. (Если бы я объявил переменные A, x, n, j, k, s в качестве переменных экземпляра, функция была бы на 31 символ короче - всего 182, но это похоже на слишком большое отклонение правил.)
Программа для тестирования (несколько разглаженная):
Программа получает входные данные из stdin в виде целых чисел, разделенных пробелами, следующим образом: во-первых, размер задачи, во-вторых, записи расширенной матрицы по строкам.
Образец прогона:
Я побрил нескольких персонажей, следуя совету Виктора о циклах и «общедоступности», сохраняя RHS в расширенной матрице вместо отдельного, и добавляя дополнительную запись в мое пробное решение, чтобы упростить создание каждого нового пробного решения. ОП также сказал, что функции достаточно - не нужно считать всю программу.
источник
while(true){f=0;for(j=0;j<n;j++)
можно заменить наwhile(true){for(f=j=0;j<n;j++)
. В дальнейшем ваш класс не должен быть публичным. Циклы for с одной инструкцией в теле не нуждаются в фигурных скобках.for(j=0;j<n;j++){for(k=0;k<n;k++){A[j][k]=p.nextInt();}b[j]=p.nextInt();}
может быть замененоfor(j=0;j<n;b[j++]=p.nextInt())for(k=0;k<n;)A[j][k++]=p.nextInt();
while(true)
можно изменить наfor(;;)
JavaScript (ES6),
152151 байтРеализация правила Крамера .
(m)(v)
Попробуйте онлайн!
источник