行列の乗算を説明する方法はたくさんあります。ここのほとんどの人はそれに精通していると思うので、私は単一の図に固執します(そして図は非常に記述的です)。より詳細な情報が必要な場合は、ウィキペディアの記事、またはWolframMathWorldの説明をご覧になることをお勧めします。
簡単な説明:
あなたは二つの行列、持っていると仮定AとB、Aが 3行2であり、Bは 2行3です。これらに対してAB、BAのいずれかの行列に行列乗算を実行すると、以下の結果が得られます。
チャレンジ:
言語にシンボリック行列乗算を実装します。入力として2つのマトリックスを使用します。ここで、マトリックス内の各要素は非空白ASCII文字(コードポイント33〜126)で表されます。これらの行列の積を出力する必要があります。
出力に関する規則:
2つのエントリの製品には、間に記号を入れてはなりません。それはだab
、ではないa*b
、a·b
、times(a,b)
または類似した何か。でaa
はありませんa^2
。
用語の合計には、間にスペース(ASCIIコードポイント32)が必要です。それa b
はa+b
、ではなく、plus(a,b)
または類似したものです。
これら2つのルールの理論的根拠は次のとおりです。すべての非空白文字は行列内の記号として許可されているため、数学記号として使用するのは面倒です。だから、あなたが普通に書くことができるものはそうa*b+c*d
なりますab cd
。
条件の順序を選択できます。ab cd
、dc ab
およびcd ba
数学的に同じことを話しているので、あなたもここに順序を選択することができます。数学的に正しい限り、順序は一貫している必要はありません。
マトリックスのフォーマットに関する規則:
マトリックスは、行間に区切り文字のない単一の文字列を除き、任意の形式で入力できます(これは、出力が完全に台無しになるためです)。両方の行列は同じ形式で入力する必要があります。以下の例はすべて、マトリックスを入力および出力する有効な方法です。
"ab;cd" <- This will look awful, but it's still accepted.
"a,b\nc,d"
[[a,b],[c,d]]
[a, b]
[c, d]
これにより面倒に見える多くのフォーマットが可能になることは承知していますが、課題は出力のフォーマットではなく行列の乗算です。
一般的なルール:
- 有効な入力を想定することができます。行列の乗算は、指定された次元で常に可能です。
- マトリックスは2つしかありません。
- 行列が空でないと仮定することができます
- 組み込み関数が受け入れられます(ただし、書式設定の要件のため、おそらく少し面倒です)。
- もちろん、必要に応じて(
\'
ではなく'
)入力にエスケープ文字を使用できます。 - 標準の入出力方法はすべてOKです。
テストケース:
2つの入力行列は、間に空の行が表示されています。出力はの後に表示されOutput:
ます。2つの出力マトリックスがある場合、受け入れられる他の出力を表示するだけです。
テストケース#1
Inputs:
[a]
[b]
Output:
[ab]
[ba] <- Also OK
テストケース#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]
テストケース#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]
ab cd
代わりに要求に関するルールへの応答a*b+c*d
が次のとおりである場合、面倒な入力/出力形式を避ける必要があります。入力および出力形式は非常に柔軟であることに注意してください。あなたが使用できないという事実*
と+
製品との合計については、それが困難に内蔵されたシンプルなを使用することを作るかもしれませんが、私はその否定的なことを考慮していません。