Istnieje wiele różnych sposobów wyjaśnienia mnożenia macierzy. Będę trzymać jedną cyfrę, ponieważ uważam, że większość ludzi tutaj jest z nią zaznajomiona (a ta liczba jest bardzo opisowa). Jeśli potrzebujesz bardziej szczegółowych informacji, sugeruję odwiedzić artykuł w Wikipedii lub wyjaśnienie na temat WolframMathWorld .
Proste wyjaśnienie:
Załóżmy, że masz dwie macierze, A i B , gdzie A to 3 na 2, a B to 2 na 3. Jeśli wykonasz mnożenie macierzy na tych macierzach, AB lub BA , otrzymasz wyniki poniżej:
Wyzwanie:
Zaimplementuj symboliczne mnożenie macierzy w swoim języku. Jako dane wejściowe weźmiesz dwie macierze, gdzie każdy element w macierzach jest reprezentowany przez znak ASCII niebiałej spacji (punkty kodowe 33-126). Musisz wyprowadzić iloczyn tych macierzy.
Zasady dotyczące wyników:
Iloczyn dwóch pozycji nie może zawierać żadnych symboli. To ab
, nie a*b
, a·b
, times(a,b)
lub coś podobnego. To aa
nie a^2
.
Suma warunków powinna zawierać spację (punkt 32 kodu ASCII) pomiędzy nimi. To a b
, nie a+b
, plus(a,b)
lub coś podobnego.
Uzasadnieniem dla tych dwóch zasad jest: Wszystkie znaki niebiałe spacje są dozwolone jako symbole w macierzach, dlatego używanie ich jako symboli matematycznych byłoby bałaganem. Więc to, co normalnie możesz napisać, a*b+c*d
jakie będzie ab cd
.
Możesz wybrać kolejność warunków. ab cd
, dc ab
I cd ba
są matematycznie rzecz biorąc takie same, więc można wybrać kolejność tu. Kolejność nie musi być spójna, o ile jest matematycznie poprawna.
Zasady dotyczące formatowania macierzy:
Macierz można wprowadzić w dowolnym formacie, z wyjątkiem pojedynczego ciągu bez ograniczników między wierszami (dzieje się tak, ponieważ dane wyjściowe zostałyby całkowicie pomieszane). Obie macierze muszą być wprowadzane w tym samym formacie. Wszystkie poniższe przykłady są prawidłowymi sposobami wprowadzania i wysyłania macierzy.
"ab;cd" <- This will look awful, but it's still accepted.
"a,b\nc,d"
[[a,b],[c,d]]
[a, b]
[c, d]
Wiem, że pozwala to na wiele formatów, które będą wyglądały na bałagan, ale wyzwanie polega na pomnożeniu macierzy, a nie na sformatowaniu danych wyjściowych.
Główne zasady:
- Możesz założyć prawidłowe dane wejściowe. Mnożenie macierzy zawsze będzie możliwe przy podanych wymiarach.
- Będą tylko dwie matryce.
- Możesz założyć, że macierze nie są puste
- Wbudowane funkcje są akceptowane (ale prawdopodobnie nieco kłopotliwe ze względu na wymagania dotyczące formatowania).
- Możesz oczywiście użyć znaków zmiany znaczenia w danych wejściowych, jeśli to konieczne (
\'
zamiast'
). - Każda standardowa metoda wejścia i wyjścia jest OK .
Przypadki testowe:
Dwie macierze wejściowe są pokazane z pustą linią pomiędzy nimi. Dane wyjściowe są wyświetlane po Output:
. Kiedy są dwie macierze wyjściowe, to po prostu pokazują inne wyjściowe, które zostałyby zaakceptowane.
Przypadek testowy nr 1
Inputs:
[a]
[b]
Output:
[ab]
[ba] <- Also OK
Przypadek testowy nr 2
Inputs:
[a, b]
[1, 4]
[y, {]
[%, 4, 1]
[a, b, c]
Output:
[a% ba, a4 bb, a1 bc]
[1% 4a, 14 4b, 11 4c]
[y% {a, y4 {b, y1 {c]
Przypadek testowy nr 3:
Inputs:
[1, 2, 3, 4]
[5, 6, 7, 8]
[9, 1, 2, 3]
[4, 5, 6, 7]
[a]
[b]
[c]
[d]
Output:
[1a 2b 3c 4d]
[5a 6b 7c 8d]
[9a 1b 2c 3d]
[4a 5b 6c 7d]
[d4 c3 b2 a1] <-- Also OK
[d8 c7 b6 a5]
[1b 9a c2 3d]
[a4 b5 d7 6c]
Jeśli twoją odpowiedzią na zasady dotyczące wymagania ab cd
zamiast a*b+c*d
jest: powinieneś unikać uciążliwych formatów wejścia / wyjścia , to chciałbym zauważyć, że formaty wejścia i wyjścia są bardzo elastyczne. Fakt, że nie można używać *
i +
dla produktów i kwot może utrudnić użyć prostego wbudowany, ale nie uważam, że nic negatywnego.