Napisz program, który rozwiąże szereg równań liniowych tak krótko, jak to możliwe. Musi rozwiązać dowolną liczbę problemów równań. Można je wprowadzać w dowolny sposób, współczynniki rozszerzonej macierzy są prawdopodobnie najłatwiejsze. Program nie musi obsługiwać współczynników ani rozwiązań niecałkowitych. Żadne zdegenerowane lub nieprawidłowe przypadki nie będą testowane. Program musi wypisać wartość każdej zmiennej lub formularza zredukowanego wiersza.
Żadne biblioteki rozwiązywania równań, funkcje macierzy ani żaden sposób automatycznego rozwiązywania równań nie jest dozwolony. Możesz symulować macierze za pomocą tablic lub list.
Przykładowe dane wejściowe (lub równoważne):
m={{2,1,-1,8},{-3,-1,2,-11},{-2,1,2,-3}}
To reprezentuje 2x+y-z=8, -3x-y+2z=-11, -2x+y+2z=-3
Przykładowe dane wyjściowe (lub równoważne):
{2,3,-1}
To reprezentuje x=2, y=3, z=-1
0x=0
lub0x=5
; 4) Przypadki, w których liczba równań jest inna niż liczba zmiennych; 5) Sprzeczne przypadki, takie jakx+5y=7, x+5y=8
; 6) Obudowy bez liniowej niezależności, jakx+3y=6, 2x+6y=12
. Czy mam rację?Odpowiedzi:
Python
169166Realizacja
Próbny
Uwaga
Jeśli zgadzasz się na przybliżenie liczby zmiennoprzecinkowej, możesz usunąć wywołanie funkcji rundy i dalej grać w golfa do 159 znaków
źródło
APL, 1 znak
Wiem, że nie spełnia (poprawionych) wymagań, ale zbyt dobrze jest nie publikować:
Symbol „domino”
⌹
(podział÷
w prostokącie) wykonuje podział macierzy, dlatego może rozwiązać dowolny układ równań liniowych. Musisz po prostu umieścić go między wektorem stałego terminu a macierzą z innymi terminami:(jeśli chcesz spróbować na TryApl,
⊃
jest↑
)źródło
JavaScript (
284181) - Metoda eliminacji GaussaTest
Zwrócona tablica łączy macierz tożsamości i rozwiązanie.
źródło
l=A.length;for(i=0;i<l;i++)
używaćfor(i=0;i<l=A.length;i++)
.for(i=l-1;i>=0;i--)
używaćfor(i=l;--i;)
.w=A[j][i]
sięfor()
i przejść{}
wokół.Ta odpowiedź nie pasuje już do pytania po zmianie reguły, ponieważ korzysta z funkcji macierzowej. *
Sage , 32 lata
Przykładowe dane wejściowe:
Przykładowe dane wyjściowe:
* Prawdopodobnie
matrix()
jest to rzut typu, a nie funkcja (uruchamianieimport types; isinstance(matrix, types.FunctionType)
dajeFalse
). Ponadto operatory~
i*
są operatorami , a nie funkcjami.źródło
Java -
522434228213 znakówRozwiązuje się przez systematyczne sprawdzanie wszystkich możliwych n-krotek całkowitych przez bezpośrednie mnożenie, aż do znalezienia jednego, który działa.
Funkcja przyjmuje rozszerzoną macierz, A, wektor rozwiązania próbnego, x i wymiar, n, jako wektor rozwiązania wejścia-wyjścia, x. Zauważ, że wektor x jest w rzeczywistości o jeden większy niż wymiar, aby pomóc przejść przez możliwe rozwiązania. (Gdybym zadeklarował zmienne A, x, n, j, k, s jako zmienne instancji, funkcja byłaby o 31 znaków krótsza - w sumie 182, ale wydaje się, że wyginanie reguł jest zbyt duże).
Program do testowania (nieco nie golfowy):
Program pobiera dane wejściowe ze stdin jako liczby całkowite oddzielone spacją w następujący sposób: po pierwsze, wymiar problemu, po drugie, wpisy rozszerzonej macierzy po rzędzie.
Przykładowy przebieg:
Ogoliłem kilka postaci, postępując zgodnie z radami Victora dotyczącymi pętli i „publicznych”, przechowując RHS w rozszerzonej matrycy zamiast osobno i dodając dodatkowy wpis do mojego rozwiązania próbnego, aby uprościć generowanie każdego nowego rozwiązania próbnego. OP stwierdził również, że wystarczy funkcja - nie trzeba liczyć całego programu.
źródło
while(true){f=0;for(j=0;j<n;j++)
można zastąpićwhile(true){for(f=j=0;j<n;j++)
. Co więcej, twoja klasa nie musi być publiczna. Pętle For z jedną instrukcją w ciele nie potrzebują nawiasów klamrowych.for(j=0;j<n;j++){for(k=0;k<n;k++){A[j][k]=p.nextInt();}b[j]=p.nextInt();}
można to zastąpićfor(j=0;j<n;b[j++]=p.nextInt())for(k=0;k<n;)A[j][k++]=p.nextInt();
while(true)
można zmienić nafor(;;)
JavaScript (ES6),
152151 bajtówWdrożenie zasady Cramera .
(m)(v)
Wypróbuj online!
źródło