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 6
que tiene tamaño a lo
2
largo de la primera dimensión (vertical) y a lo3
largo 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
×2
y3
×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
×2
y3
×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
×2
y3
×1
darían un error, porque los tamaños a lo largo de la primera dimensión son2
y3
: 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
× 2
y 3
× 1
como 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
× b
y c
× d
dan 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]
)