Este desafío está relacionado con algunas de las características del lenguaje MATL, como parte del evento Idioma del mes de mayo de 2018 .
Introducción
En MATL, muchas funciones de dos entradas funcionan por elementos con broadcast . Esto significa lo siguiente:
En cuanto al elemento (o vectorizado ): la función toma como entradas dos matrices con tamaños coincidentes. La operación definida por la función se aplica a cada par de entradas correspondientes. Por ejemplo, usando la notación posterior a la corrección:
[2 4 6] [10 20 30] +da la salida
[12 24 36]Esto también funciona con matrices multidimensionales. La notación
[1 2 3; 4 5 6]representa la matriz2×3(matriz)1 2 3 4 5 6que tiene tamaño a lo
2largo de la primera dimensión (vertical) y a lo3largo de la segunda (horizontal). Así por ejemplo[2 4 6; 3 5 7] [10 20 30; 40 60 80] *[20 80 180; 120 300 560]Difusión o ( expansión singleton ): las dos matrices de entrada no tienen tamaños coincidentes, pero en cada dimensión no coincidente, una de las matrices tiene tamaño
1. Esta matriz se replica implícitamente a lo largo de las otras dimensiones para hacer coincidir los tamaños; y luego la operación se aplica por elementos como se indicó anteriormente. Por ejemplo, considere dos matrices de entrada con tamaños1×2y3×1:[10 20] [1; 2; 5] /Gracias a la transmisión, esto es equivalente a
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /y entonces da
[10 20; 5 10; 2 4]Del mismo modo, con los tamaños
3×2y3×1(la transmisión ahora actúa solo a lo largo de la segunda dimensión),[9 8; 7 6; 5 4] [10; 20; 30] +[19 18; 27 26; 35 34]El número de dimensiones puede incluso ser diferente. Por ejemplo, las entradas con tamaños 3 × 2 y 3 × 1 × 5 son compatibles y dan un resultado de 3 × 2 × 5. De hecho, el tamaño 3 × 2 es el mismo que 3 × 2 × 1 (hay arbitrariamente muchas dimensiones singleton finales implícitas).
Por otro lado, un par de matrices
2×2y3×1darían un error, porque los tamaños a lo largo de la primera dimensión son2y3: no son iguales y ninguno lo es1.
Definición de radiodifusión modular
La transmisión modular es una generalización de la transmisión que funciona incluso si ninguno de los tamaños no coincidentes es 1. Considere, por ejemplo, las siguientes matrices 2× 2y 3× 1como entradas de la función +:
[2 4; 6 8] [10; 20; 30] +
La regla es la siguiente: para cada dimensión, la matriz que es más pequeña a lo largo de esa dimensión se replica modularmente (cíclicamente) para que coincida con el tamaño de la otra matriz. Esto haría que lo anterior sea equivalente a
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
con el resultado
[12 14; 26 28; 32 34]
Como segundo ejemplo,
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
produciría
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
En general, las entradas con tamaños a× by c× ddan un resultado de tamaño max(a,b)× max(c,d).
El reto
Implemente la adición para matrices bidimensionales con transmisión modular como se definió anteriormente.
Las matrices serán rectangulares (no irregulares), solo contendrán enteros no negativos y tendrán un tamaño de al menos1 en cada dimensión.
Reglas adicionales:
La entrada y la salida se pueden tomar por cualquier medio razonable . Su formato es flexible como siempre.
Se permiten programas o funciones, en cualquier lenguaje de programación . Las lagunas estándar están prohibidas .
El código más corto en bytes gana.
Casos de prueba
Los siguientes usos ;como separador de filas (como en los ejemplos anteriores). Cada caso de prueba muestra las dos entradas y luego la salida.
[2 4; 6 8]
[10; 20; 30]
[12 14; 26 28; 32 34]
[5 10; 15 20]
[0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0]
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
[1]
[2]
[3]
[1; 2]
[10]
[11; 12]
[1 2 3 4 5]
[10 20 30]
[11 22 33 14 25]
[9 12 5; 5 4 2]
[4 2; 7 3; 15 6; 4 0; 3 3]
[13 14 9;12 7 9;24 18 20;9 4 6;12 15 8]
[9 12 5; 5 4 2]
[4 2 6 7; 7 3 7 3; 15 6 0 1; 4 0 1 16; 3 3 3 8]
[13 14 11 16; 12 7 9 8; 24 18 5 10; 9 4 3 21; 12 15 8 17]
[6 7 9]
[4 2 5]
[10 9 14]
1× n(como [1 2 3]) o n× 1(como [1; 2; 3])