Вызов
Учитывая матрицу M с r строками и столбцами c и двумя булевыми списками V длины r и H длины c , вычислите разделенные совокупные вертикальные и горизонтальные суммы.
правила
r и c больше или равны единице
H и V начинаются с истинного значения
Значения в 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
Разделите M на группы столбцов, начиная новую группу при каждом истинном значении H
┌─────┬────────┐
│ 1 2│ 3 4 5│
│ 6 7│ 8 9 10│
│11 12│13 14 15│
│16 17│18 19 20│
└─────┴────────┘
Разделите каждую группу столбцов на группы строк, начиная новую группу с каждым истинным значением V :
┌─────┬────────┐
│ 1 2│ 3 4 5│
├─────┼────────┤
│ 6 7│ 8 9 10│
│11 12│13 14 15│
├─────┼────────┤
│16 17│18 19 20│
└─────┴────────┘
Суммируйте каждую ячейку по горизонтали:
┌─────┬────────┐
│ 1 3│ 3 7 12│
├─────┼────────┤
│ 6 13│ 8 17 27│
│11 23│13 27 42│
├─────┼────────┤
│16 33│18 37 57│
└─────┴────────┘
Суммируйте каждую ячейку по вертикали:
┌─────┬────────┐
│ 1 3│ 3 7 12│
├─────┼────────┤
│ 6 13│ 8 17 27│
│17 36│21 44 69│
├─────┼────────┤
│16 33│18 37 57│
└─────┴────────┘
Результат:
┌──────────────┐
│ 1 3 3 7 12│
│ 6 13 8 17 27│
│17 36 21 44 69│
│16 33 18 37 57│
└──────────────┘
Дополнительные тестовые случаи
М :
┌───────────┐
│15 11 11 17│
│13 20 18 8│
└───────────┘
H : 1 0 0 1
V :1 0
Результат:
┌───────────┐
│15 26 37 17│
│28 59 88 25│
└───────────┘
М :
┌─┐
│7│
└─┘
Результат ( H и V должны быть 1
):
┌─┐
│7│
└─┘
М :
┌──┐
│ 3│
│-1│
│ 4│
└──┘
V : 1 1 0
( H должен быть 1
)
Результат:
┌──┐
│ 3│
│-1│
│ 3│
└──┘
М :
┌───────────────────────────────────────────────────────┐
│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
Результат:
┌────────────────────────────────────────────────────────────────┐
│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 (Дьялог) , 13 байт
Принимает VHM в качестве аргумента.
Попробуйте онлайн!
{
…}/
Вставить (уменьшить на) следующую анонимную функцию, где термин слева представлен символом ⍺, а термин справа представлен символом ⍵. Из-за того, что функции APL ассоциативны справа, это, следовательно, V f ( H f M ).⍺⊂⍵
раздел ⍵ согласно ⍺+\¨
накопленная сумма каждой части,/
уменьшить путем объединения (это включает в себя результат, чтобы уменьшить ранг)⊃
раскрывать⍉
транспонированияисточник
Python 2 + NumPy,
143138117115110108 байт-21 байт благодаря Адаму !
Попробуйте онлайн!
источник
Желе ,
1514 байтДиадическая ссылка, берущая
H,V
слева иM
справа и возвращающая полученную матрицу.Попробуйте онлайн!
Альтернативно в виде одной строки также для 14:
Ḣœṗ+\€Ẏ$¥Ð€Zð⁺
Как?
Предыдущая:
Полная программа печати представления результата.
источник
MATL , 19 байт
Входные данные
M
(матрица),H
(вектор столбца),V
(вектор столбца). Разделитель строк есть;
.Попробуйте онлайн! Или проверьте все тестовые случаи: 1 , 2 , 3 , 4 , 5 .
объяснение
Это делает накопленную сумму по горизонтали, а затем по вертикали.
источник
J , 20 байт
Попробуйте онлайн!
Ввод принимается как массив блоков, содержащих
[V, H, M]
.объяснение
источник
Mathematica, 212 байтов
вход
[M, H, V]
источник
C # (.NET Core) , 164 байта
Попробуйте онлайн!
В основном это именно так, как указано в ОП. Сначала выполняется итерация для суммирования по горизонтали, а затем повторяется для суммирования по вертикали.
источник
Haskell ,
129 байт119 байтПопробуйте онлайн!
Сохранено 10 байтов благодаря @ceasedtoturncounterclockwis
t
(для транспонирования) переключает строки и столбцы. Быстрое объяснение:Читайте справа налево: мы просматриваем строки снизу вверх и помещаем каждое значение в столбец назначения.
s
в основном скользящая сумма векторов, но сбрасывается при возникновении истинного значения вv
f
суммирует строкиs
следующим образомv
и делает то же самое с последующими столбцамиh
источник
t=foldr(zipWith(:))(repeat[])
, Не только короче, но и гораздо менее неэффективно.JavaScript (ES6), 88 байт
источник
Желе , 31 байт
Попробуйте онлайн!
Gah это слишком долго для желе xD
Кстати, 11/31 байт в этой программе состоит из символов евро. Это более трети программы!
источник