Es gibt viele verschiedene Möglichkeiten, die Matrixmultiplikation zu erklären. Ich bleibe bei einer einzigen Figur, da ich glaube, dass die meisten Leute hier damit vertraut sind (und die Figur ist sehr beschreibend). Wenn Sie detailliertere Informationen wünschen, empfehle ich Ihnen, den Wikipedia-Artikel oder die Erklärung zu WolframMathWorld zu besuchen .
Einfache Erklärung:
Angenommen, Sie haben zwei Matrizen, A und B , wobei A 3 mal 2 und B 2 mal 3 ist. Wenn Sie eine Matrixmultiplikation mit diesen Matrizen durchführen, entweder AB oder BA, erhalten Sie die folgenden Ergebnisse:
Herausforderung:
Implementieren Sie die symbolische Matrixmultiplikation in Ihrer Sprache. Sie müssen zwei Matrizen als Eingabe verwenden, wobei jedes Element in den Matrizen durch ein Nicht-Leerzeichen-ASCII-Zeichen dargestellt wird (Codepunkte 33-126). Sie müssen das Produkt dieser Matrizen ausgeben.
Regeln zur Ausgabe:
Ein Produkt aus zwei Einträgen darf keine Symbole dazwischen haben. Es ist ab
, nicht a*b
, a·b
, times(a,b)
oder etwas ähnliches. Ist es aa
nicht a^2
.
Die Summe der Begriffe sollte ein Leerzeichen (ASCII-Code Punkt 32) dazwischen haben. Es ist a b
, nicht a+b
, plus(a,b)
oder etwas ähnliches.
Das Grundprinzip für diese beiden Regeln ist: Alle Zeichen, die keine Leerzeichen sind, dürfen als Symbole in der Matrix verwendet werden, daher wäre ihre Verwendung als mathematische Symbole unübersichtlich. Also, was du normalerweise schreiben könntest, wie a*b+c*d
es sein wird ab cd
.
Sie können die Reihenfolge der Begriffe wählen. ab cd
, dc ab
und cd ba
sind mathematisch gesehen gleich, so dass Sie auch hier die Reihenfolge wählen können. Die Reihenfolge muss nicht konsistent sein, solange sie mathematisch korrekt ist.
Regeln zur Matrixformatierung:
Eine Matrix kann in einem beliebigen Format eingegeben werden, mit Ausnahme einer einzelnen Zeichenfolge ohne Trennzeichen zwischen den Zeilen (dies liegt daran, dass die Ausgabe vollständig durcheinander geraten würde). Beide Matrizen müssen im selben Format eingegeben werden. Alle folgenden Beispiele sind gültige Möglichkeiten zum Eingeben und Ausgeben einer Matrix.
"ab;cd" <- This will look awful, but it's still accepted.
"a,b\nc,d"
[[a,b],[c,d]]
[a, b]
[c, d]
Ich bin mir bewusst, dass dies viele Formate zulässt, die unordentlich aussehen werden, aber die Herausforderung besteht darin, Matrizen zu multiplizieren und die Ausgabe nicht zu formatieren.
Allgemeine Regeln:
- Sie können eine gültige Eingabe annehmen. Eine Matrixmultiplikation ist mit den angegebenen Dimensionen immer möglich.
- Es gibt nur zwei Matrizen.
- Sie können davon ausgehen, dass die Matrizen nicht leer sind
- Eingebaute Funktionen werden akzeptiert (sind aber aufgrund der Formatierungsanforderungen wahrscheinlich etwas umständlich).
- Sie können natürlich bei Bedarf (
\'
anstelle von'
) Escape-Zeichen in der Eingabe verwenden . - Jede Standard-Eingabe- und Ausgabemethode ist in Ordnung .
Testfälle:
Die beiden Eingangsmatrizen werden mit einer Leerzeile dazwischen angezeigt. Die Ausgabe wird nach angezeigt Output:
. Wenn zwei Ausgangsmatrizen vorhanden sind, werden nur andere Ausgänge angezeigt, die akzeptiert würden.
Testfall Nr. 1
Inputs:
[a]
[b]
Output:
[ab]
[ba] <- Also OK
Testfall 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]
Testfall 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]
Wenn Ihre Antwort auf die Regeln zum Anfordern ab cd
statt a*b+c*d
lautet: Sie sollten umständliche Eingabe- / Ausgabeformate vermeiden , dann möchte ich darauf hinweisen, dass die Eingabe- und Ausgabeformate sehr flexibel sind. Die Tatsache, dass Sie nicht *
und +
für Produkte und Summen verwenden können, könnte es schwieriger machen, ein einfaches eingebautes zu verwenden, aber ich betrachte diese negative Sache nicht.
quelle
Antworten:
Haskell ,
6261 BytesProbieren Sie es online! Anwendungsbeispiel:
Ich habe einen Weg gefunden, eine
transpose
Funktion in einem Byte kürzer als mit dem Import zu bekommen:Alte Version mit Import: (62 Bytes)
Probieren Sie es online!
Das ist ganz ähnlich wie meine Antwort auf nicht-symbolische Matrix - Multiplikation :
a!b=[sum.zipWith(*)r<$>transpose b|r<-a]
die Multiplikation Substitution(*)
mit String - Verkettung(++)
undsum
mitunwords
denen verkettet eine Liste von Strings mit einem Raum dazwischen. Der Import wird für dietranspose
Funktion benötigt , so dass die Transposition der zweiten Matrix insgesamt die Hälfte der Bytes verbraucht ...Alte Version ohne Import: (64 Bytes)
Probieren Sie es online!
Da der Import und die
transpose
Funktion so viele Bytes beanspruchen, habe ich versucht, die Aufgabe ohne Import zu lösen. Bisher hat sich herausgestellt, dass dieser Ansatz zwei Bytes länger ist, er ist jedoch möglicherweise besser geeignet. Edit: Der andere Ansatz oben schlägt jetzt den Import!Beim Listenverständnis werden
[s:t|_:s:t<-b]
die nicht leeren Endpunkte der Listen berücksichtigt. Wennb
nur[t|_:t<-b]
die Endpunkte verwendet werden, sind diese 4 Byte kürzer (sogar besser als bei der Importversion), es wird jedoch eine leere Zeile wie["","",""]
bei der Matrix angehängt, was meiner Meinung nach nicht zulässig ist.quelle
Mathematica, 36 Bytes
Inner
ist eine Verallgemeinerung von MathematicaDot
(dh das übliche Matrix- / Vektorprodukt). Es verallgemeinert das Skalarprodukt von zwei Funktion lassen liefernf
undg
, die anstelle der üblichen Multiplikation und Addition verwendet wird, respectively. Wir ersetzen die Multiplikation mit#<>#2&
(die die beiden Zeichen zu einer einzigen Zeichenfolge zusammenfügt) und die Addition mitStringRiffle@*List
, die zuerst alle Summanden in eine Liste einschließt und sie dannStringRiffle
mit Leerzeichen zusammenfügt.Man könnte möglicherweise den
Dot
Operator verwenden.
und dann das Ergebnis transformieren, aber das Problem ist, dass Dinge wie"a"*"a"
sofort transformiert werden"a"^2
(dasselbe für Summen), was ärgerlich wäre, wenn man sie wieder auseinander nimmt.quelle
Ruby, 61 Bytes
Probelauf:
quelle
Clojure, 53 Bytes
Läuft mit Argumenten
[["a" "b"]["c" "e"]]
und[["f" "g"]["h" "i"]]
kehrt zurück((("af" "bh") ("ag" "bi")) (("cf" "eh") ("cg" "ei")))
. Dies ist tatsächlich kürzer als die numerische Version .quelle
Dyalog APL , 10 Bytes
Nimmt Matrizen von Zeichen als linkes und rechtes Argument. Gibt eine Matrix mit Listen von Zeichen zurück. (APL stellt Zeichenfolgen als Liste von Zeichen dar.)
TryAPL online!
Normales inneres Produkt ist in APL
+.×
, aber die Addition und Multiplikation kann eine beliebige Funktion sein, insbesondere:Die Hinzufügung wurde durch
{
eine anonyme Funktion ersetzt:∊
die abgeflachte⍺ ' ' ⍵
Liste, die aus dem linken Argument, einem Leerzeichen und dem rechten Argument besteht⍵
}
Die Multiplikation wurde durch Verkettung ersetzt.
,
quelle
Gelee , 7 Bytes
Dies ist eine dyadische Verknüpfung, die B und A als Argumente (in dieser Reihenfolge) verwendet und AB zurückgibt . Eingabe und Ausgabe erfolgen in Form von 2D-Arrays von Zeichenfolgen, bei denen es sich tatsächlich um 3D-Arrays von Zeichen handelt. Ein weiteres Byte könnte durch die Verwendung von 2D- Zeichenfeldern gespeichert werden als Eingabe verwendet werden. Ich bin mir nicht sicher, ob das erlaubt ist.
Probieren Sie es online!
Es ist ein bisschen schwierig zu bestimmen, was Jelly unter der Haube macht, wenn es um Schnüre geht, da es vor dem Drucken viel plätschert. So repräsentiert Jelly intern Input und Output.
Wie es funktioniert
quelle
Prolog,> 256 Bytes
Ich benutze {_ | _} ist ein Findall / 3, _ [_, _] ist ein Arg / 3 und sum (_) ist ein Aggregat. Sie können alle in is / 2 verwendet werden:
Zusammen mit den zusätzlichen Definitionen für die oben genannten Prädikate und die Nicht-Standard ist / 2, die mehr als Zahlen zurückgeben kann, sicher> 256 Byte.
quelle
JavaScript (ES6), 65 Byte
Übernimmt die Eingabe als zwei 2D-Zeichenfelder und gibt ein 2D-Zeichenfeld zurück. Fügen Sie 10 Bytes hinzu, um die Eingabe als zwei 1D-Strings zu unterstützen.
quelle
Pyth, 14 Bytes
Ein Programm, das zwei durch Zeilenumbrüche getrennte zweidimensionale Listen von Zeichen eingibt und eine zweidimensionale Liste von Zeichenfolgen ausgibt.
Testsuite
Wie es funktioniert
[Erklärung kommt später]
quelle
Pip , 17 Bytes
Dies ist eine Funktion, die zwei verschachtelte Listen von (Einzelzeichen-) Zeichenfolgen verwendet und eine verschachtelte Liste von Zeichenfolgen zurückgibt. Probieren Sie es online!(mit zwei Testfällen).
Erläuterung
Argumente für eine
{}
-begrenzte Funktion werden den lokalen Variablena
bis zugewiesene
. Das erste Argument einer Lambda-Funktion wird durch dargestellt_
.quelle