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]
fuente
1
×n
(como[1 2 3]
) on
×1
(como[1; 2; 3]
)Respuestas:
Jalea , 10 bytes
Toma un par de matrices (dos matrices de filas) como entrada y devuelve una matriz.
Pruébalo en línea!
Cómo funciona
fuente
Carbón ,
2523 bytesPruébalo en línea! El enlace es a la versión detallada del código. Toma la entrada como una matriz tridimensional. Explicación:
Ingrese todo.fuente
MATL ,
2524 bytesPruébalo en línea!
¡Finalmente! ¡Solo tomó una semana para que el desafío inspirado en el Idioma del mes fuera respondido por el Idioma del mes!
Supongo que no es lo más corto posible, pero estoy bastante feliz porque mi versión inicial tenía más de 40 bytes. editar: ¡Tenía razón, Luis encontró otro byte para exprimir!
fuente
:
con entrada vectorialPython 3 ,
127126125 bytesgolfó un byte cambiando
sum(m)
am+n
Un byte más gracias a @Jonathan Frech
Toma datos como una lista de dos matrices bidimensionales.
Z
lambda toma dos matrices como entrada y devuelve un iterador que produce un índice y valores fusionados de ambas matrices, hasta que el índice alcanza la longitud de la matriz más grande. La variable de índice no es útil para mí y me cuesta bytes, pero no sé cómo hacerlo sin ella ... ( relacionado )Z
a las matrices externas e internas. Los valores más internos se suman.Pruébalo en línea!
Usar se
itertools.cycle
siente un poco como hacer trampa, pero creo que la longitud de la declaración de importación me ha castigado lo suficiente :)Estoy seguro de que esto podría ser Jugamos al golf un poco más, especialmente el método de iteración que las hojas de estos inútiles
i
yj
variables. Le agradecería cualquier consejo sobre cómo jugar golf, probablemente me estoy perdiendo algo obvio.fuente
zip
los argumentos, invertirf
la asignación de comprensión y así eliminar un espacio (for i,*l
->for*l,i
)? ( 125 bytes )?JavaScript (ES6), 131 bytes
No es la herramienta adecuada para el trabajo, y probablemente tampoco sea el enfoque correcto. Oh bueno ... ¯ \ _ (ツ) _ / ¯
Pruébalo en línea!
¿Cómo?
La función auxiliar g () crea una matriz que es tan grande como la matriz de entrada más grande ( una o b ) e invoca la función de devolución de llamada c sobre ella:
La función auxiliar h () lee la matriz 2D a en (x, y) con transmisión modular:
El código principal ahora simplemente se lee como:
Versión recursiva, 134 bytes.
Pruébalo en línea!
fuente
05AB1E , 15 bytes
Pruébalo en línea!
Versión anterior, 25 bytes
Pruébalo en línea!
Explicación
15 byter:
25 byter:
fuente
R ,
136104103 9595 bytesBajó la friolera de
3335 bytes siguiendo el consejo de Giuseppe. Se las arregló para obtener menos de 100 bytes utilizando un operador como nombre de función. Consulte el historial para obtener un código más legible.Pruébalo en línea!
fuente
apply
yrep.len
es lo que había considerado, aunque no había podido codificarlo yo mismo.dim
, mucho más limpio y abre la puerta a una generalización multidimensional con llamadas recursivas ar
outer(x,y,"+")
que contiene todas las sumas correctas, y en un patrón claro. No puedo entender cómo extraerlos de manera eficiente.K (ngn / k) , 23 bytes
Pruébalo en línea!
fuente
05AB1E , 18 bytes
Pruébalo en línea!
Explicación
fuente
Pyth, 24 bytes
Pruébalo aquí
Explicación
fuente
Java 8, 172 bytes
Pruébalo en línea.
Explicación:
fuente
APL (Dyalog Classic) ,
2321 bytesPruébalo en línea!
esta podría ser la única vez que tengo la oportunidad de usar
|[0]
fuente
Python 2 ,
124116 bytesPruébalo en línea!
Explicación:
Toma la lista de dos listas 2-d como entrada.
fuente
Python 2 ,
10197105 bytesEditar: Gracias (¡otra vez!) A Dead Possum por guardar 4 bytes
Edición 2: perdió 8 bytes, algunos casos de prueba no pasaban
Una mezcla entre la solución anterior de Dead Possum (¡gracias a él!) Y mi propia solución Python 3 .
Pruébalo en línea!
La misma entrada que mi solución Python 3 (un par de listas de 2 dimensiones).
Código comentado:
fuente
Julia 0.6 ,
8583 bytesPruébalo en línea!
(Reemplazar
⧻
con\
gracias a Jo King )Funciona repitiendo cada matriz horizontal y verticalmente para que ambas tengan el mismo tamaño (producto de tamaños de fila x producto de tamaños de columna), sumando esas y extrayendo la región correcta de eso. (Las entradas de vector de fila o las entradas de vector de columna necesitan una
reshape
llamada para convertirse en matrices bidimensionales, lo que supongo que está bien, ya que la pregunta especifica "Implementar la adición para matrices bidimensionales" y "Cualquier entrada puede tomar la entrada y la salida medios razonables. Su formato es flexible como de costumbre ")fuente