Existem muitas maneiras diferentes de explicar a multiplicação de matrizes. Vou ficar com uma única figura, pois acredito que a maioria das pessoas aqui está familiarizada com ela (e a figura é muito descritiva). Se você quiser informações mais detalhadas, sugiro que visite o artigo da Wikipedia ou a explicação sobre o WolframMathWorld .
Explicação simples:
Suponha que você tenha duas matrizes, A e B , onde A é 3 por 2 e B é 2 por 3. Se você executar a multiplicação de matrizes nessas matrizes, AB ou BA, obterá os resultados abaixo:
Desafio:
Implemente a multiplicação matricial simbólica no seu idioma. Você deve usar duas matrizes como entrada, em que cada elemento nas matrizes é representado por um caractere ASCII que não é um espaço em branco (pontos de código 33-126). Você deve produzir o produto dessas matrizes.
Regras relativas à saída:
Um produto de duas entradas não deve ter nenhum símbolo no meio. É ab
, não a*b
, a·b
, times(a,b)
ou algo similar. É aa
, não a^2
.
A soma dos termos deve ter um espaço (ponto 32 do código ASCII) no meio. É a b
, não a+b
, plus(a,b)
ou algo semelhante.
A lógica para essas duas regras é: todos os caracteres de espaço não em branco são permitidos como símbolos nas matrizes, portanto, usá-los como símbolos matemáticos seria uma bagunça. Então, o que você normalmente poderia escrever como a*b+c*d
será ab cd
.
Você pode escolher a ordem dos termos. ab cd
, dc ab
e cd ba
matematicamente estão falando o mesmo, então você também pode escolher o pedido aqui. O pedido não precisa ser consistente, desde que seja matematicamente correto.
Regras relativas à formatação da matriz:
Uma matriz pode ser inserida no formato que você quiser, exceto uma única sequência sem delimitadores entre linhas (isso ocorre porque a saída seria completamente confusa). Ambas as matrizes devem ser inseridas no mesmo formato. Todos os exemplos abaixo são formas válidas de inserir e produzir uma matriz.
"ab;cd" <- This will look awful, but it's still accepted.
"a,b\nc,d"
[[a,b],[c,d]]
[a, b]
[c, d]
Estou ciente de que isso permite muitos formatos que parecerão confusos, mas o desafio é multiplicar matrizes, não formatar a saída.
Regras gerais:
- Você pode assumir uma entrada válida. A multiplicação de matrizes sempre será possível com as dimensões especificadas.
- Haverá apenas duas matrizes.
- Você pode assumir que as matrizes não estão vazias
- Funções internas são aceitas (mas provavelmente um pouco complicadas devido aos requisitos de formatação).
- Obviamente, você pode usar caracteres de escape na entrada, se necessário (em
\'
vez de'
). - Qualquer método padrão de entrada e saída está OK .
Casos de teste:
As duas matrizes de entrada são mostradas com uma linha vazia no meio. A saída é mostrada depois Output:
. Quando existem duas matrizes de saída, é apenas para mostrar outras saídas que seriam aceitas.
Caso de teste nº 1
Inputs:
[a]
[b]
Output:
[ab]
[ba] <- Also OK
Caso de teste nº 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]
Caso de teste nº 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]
Se a sua resposta às regras sobre exigir em ab cd
vez de a*b+c*d
for: você deve evitar formatos de entrada / saída complicados , gostaria de observar que os formatos de entrada e saída são muito flexíveis. O fato de você não poder usar *
e +
para produtos e somas pode dificultar o uso de um simples embutido, mas não considero isso negativo.