Desafío
Dada una matriz M con r filas y c columnas, y dos listas booleanas V de longitud r y H de longitud c , calcule las sumas acumuladas verticales y horizontales divididas.
Reglas
r y c son mayores o iguales a uno
H y V comienzan con un valor verdadero
Los valores en M están dentro del dominio numérico razonable de su idioma.
El particionamiento y la suma comienzan en la esquina superior izquierda.
Ensayar
Dado M :
┌──────────────┐
│ 1 2 3 4 5│
│ 6 7 8 9 10│
│11 12 13 14 15│
│16 17 18 19 20│
└──────────────┘
H :1 0 1 0 0
V :1 1 0 1
Divida M en grupos de columnas, comenzando un nuevo grupo en cada valor verdadero de H
┌─────┬────────┐
│ 1 2│ 3 4 5│
│ 6 7│ 8 9 10│
│11 12│13 14 15│
│16 17│18 19 20│
└─────┴────────┘
Divida cada grupo de columnas en grupos de filas, comenzando un nuevo grupo en cada valor verdadero de V :
┌─────┬────────┐
│ 1 2│ 3 4 5│
├─────┼────────┤
│ 6 7│ 8 9 10│
│11 12│13 14 15│
├─────┼────────┤
│16 17│18 19 20│
└─────┴────────┘
Suma acumulativamente cada celda horizontalmente:
┌─────┬────────┐
│ 1 3│ 3 7 12│
├─────┼────────┤
│ 6 13│ 8 17 27│
│11 23│13 27 42│
├─────┼────────┤
│16 33│18 37 57│
└─────┴────────┘
Suma acumulativamente cada celda verticalmente:
┌─────┬────────┐
│ 1 3│ 3 7 12│
├─────┼────────┤
│ 6 13│ 8 17 27│
│17 36│21 44 69│
├─────┼────────┤
│16 33│18 37 57│
└─────┴────────┘
Resultado:
┌──────────────┐
│ 1 3 3 7 12│
│ 6 13 8 17 27│
│17 36 21 44 69│
│16 33 18 37 57│
└──────────────┘
Casos de prueba adicionales
M :
┌───────────┐
│15 11 11 17│
│13 20 18 8│
└───────────┘
H : 1 0 0 1 V :1 0
Resultado:
┌───────────┐
│15 26 37 17│
│28 59 88 25│
└───────────┘
M :
┌─┐
│7│
└─┘
Resultado ( H y V deben ser 1):
┌─┐
│7│
└─┘
M :
┌──┐
│ 3│
│-1│
│ 4│
└──┘
V : 1 1 0( H debe ser 1)
Resultado:
┌──┐
│ 3│
│-1│
│ 3│
└──┘
M :
┌───────────────────────────────────────────────────────┐
│10 7.7 1.9 1.5 5.4 1.2 7.8 0.6 4.3 1.2 4.5 5.4 0.3│
│ 2.3 3.8 4.1 4.5 1 7.7 3 3.4 6.9 5.8 9.5 1.3 7.5│
│ 9.1 3.7 7.2 9.8 3.9 10 7.6 9.6 7.3 6.2 3.3 9.2 9.4│
│ 4.3 4.9 7.6 2 1.4 5.8 8.1 2.4 1.1 2.3 7.3 3.6 6 │
│ 9.3 10 5.8 9.6 5.7 8.1 2.1 3.9 4 1.3 6.3 3.1 9 │
│ 6.6 1.4 0.5 6.5 4.6 2.1 7.5 4.3 9 7.2 2.8 3.6 4.6│
│ 1.7 9.9 2.4 4.5 1.3 2.6 6.4 7.8 6.2 3.2 10 5.2 8.9│
│ 9.9 5.3 4.5 6.3 1.4 3.1 2.3 7.9 7.8 7.9 9.6 4 5.8│
└───────────────────────────────────────────────────────┘
H :1 0 0 1 0 1 1 1 0 1 1 1 0
V :1 0 0 0 0 1 0 0
Resultado:
┌────────────────────────────────────────────────────────────────┐
│10 17.7 19.6 1.5 6.9 1.2 7.8 0.6 4.9 1.2 4.5 5.4 5.7│
│12.3 23.8 29.8 6 12.4 8.9 10.8 4 15.2 7 14 6.7 14.5│
│21.4 36.6 49.8 15.8 26.1 18.9 18.4 13.6 32.1 13.2 17.3 15.9 33.1│
│25.7 45.8 66.6 17.8 29.5 24.7 26.5 16 35.6 15.5 24.6 19.5 42.7│
│35 65.1 91.7 27.4 44.8 32.8 28.6 19.9 43.5 16.8 30.9 22.6 54.8│
│ 6.6 8 8.5 6.5 11.1 2.1 7.5 4.3 13.3 7.2 2.8 3.6 8.2│
│ 8.3 19.6 22.5 11 16.9 4.7 13.9 12.1 27.3 10.4 12.8 8.8 22.3│
│18.2 34.8 42.2 17.3 24.6 7.8 16.2 20 43 18.3 22.4 12.8 32.1│
└────────────────────────────────────────────────────────────────┘

APL (Dyalog) , 13 bytes
Toma ist de VHM como argumento.
Pruébalo en línea!
{...}/inserte (reduzca) la siguiente función anónima, donde el término de la izquierda está representado por ⍺ y el término de la derecha está representado por ⍵. Debido a que las funciones APL son asociativas correctas, esto es, por lo tanto, V f ( H f M ).⍺⊂⍵partición ⍵ según ⍺+\¨suma acumulativa de cada parte,/reducir por concatenación (esto incluye el resultado para reducir el rango)⊃revelar⍉transponerfuente
Python 2 + numpy,
143138117115110108 bytes-21 bytes gracias a Adám !
Pruébalo en línea!
fuente
Jalea ,
1514 bytesUn enlace diádico que toma
H,Va la izquierda yMa la derecha y devuelve la matriz resultante.Pruébalo en línea!
Alternativamente como una sola línea también para 14:
Ḣœṗ+\€Ẏ$¥Ð€Zð⁺¿Cómo?
Anterior:
Un programa completo que imprime una representación del resultado.
fuente
MATL , 19 bytes
Las entradas son
M(matriz),H(vector de columna),V(vector de columna). El separador de fila es;.Pruébalo en línea! O verifique todos los casos de prueba: 1 , 2 , 3 , 4 , 5 .
Explicación
Esto hace la suma acumulativa horizontalmente, luego verticalmente.
fuente
J , 20 bytes
Pruébalo en línea!
La entrada se toma como una matriz de cuadros que contienen
[V, H, M].Explicación
fuente
Mathematica, 212 bytes
entrada
[M, H, V]
fuente
C # (.NET Core) , 164 bytes
Pruébalo en línea!
Básicamente, hace exactamente lo especificado en el OP. Primero itera para sumar horizontalmente y luego itera nuevamente para sumar verticalmente.
fuente
Haskell ,
129 bytes119 bytesPruébalo en línea!
Guardado 10 bytes gracias a @ceasedtoturncounterclockwis
t(para transponer) cambia filas y columnas. Una explicación rápida:Lea de derecha a izquierda: exploramos las filas de abajo hacia arriba y empujamos cada valor en su columna de destino.
ses básicamente una suma continua de vectores, pero se restablece cuando surge un valor Verdadero envfsuma las filas con elssiguientevy haz lo mismo con las siguientes columnashfuente
t=foldr(zipWith(:))(repeat[]). No solo más corto, también mucho menos ineficiente.JavaScript (ES6), 88 bytes
fuente
Jalea , 31 bytes
Pruébalo en línea!
Gah, esto es demasiado tiempo para Jelly xD
Por cierto, 11/31 bytes en este programa consta de caracteres en euros. ¡Eso es más de un tercio del programa!
fuente