Возьмите непустую матрицу / числовой массив, содержащий положительные целые числа в качестве входных данных. Верните в этом порядке суммы первой строки и столбца, затем второй строки и столбца и продолжайте, пока не останется больше строк или столбцов.
Предположим, что вход:
2 10 10 2 4
9 7 7 2 9
1 7 6 2 4
7 1 4 8 9
Тогда вывод должен быть:
45, 33, 16, 17
Потому что: 2+9+1+7+10+10+2+4=45, 7+7+1+7+2+9=33, 6+4+2+4=16, 8+9=17
.
Тестовые случаи:
Тестовые случаи имеют следующий формат:
Input
---
Output
5
---
5
..........
1 4
----
5
..........
7
2
---
9
..........
8 3 7 10 3 7 10 1
10 7 5 8 4 3 3 1
1 6 4 1 3 6 10 1
2 3 8 2 8 3 4 1
---
62 40 33 18
..........
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20
---
320 226 235 263 135 26 20
..........
7 10 1
4 4 2
6 3 4
1 4 10
5 7 6
---
34 20 20
Как массивы:
[[5]]
[[1,4]]
[[7],[2]]
[[8,3,7,10,3,7,10,1],[10,7,5,8,4,3,3,1],[1,6,4,1,3,6,10,1],[2,3,8,2,8,3,4,1]]
[[30,39,48,1,10,19,28],[38,47,7,9,18,27,29],[46,6,8,17,26,35,37],[5,14,16,25,34,36,45],[13,15,24,33,42,44,4],[21,23,32,41,43,3,12],[22,31,40,49,2,11,20]]
[[7,10,1],[4,4,2],[6,3,4],[1,4,10],[5,7,6]]
Это код-гольф, поэтому выигрывает самое короткое решение на каждом языке.
10,7,7,1
, вторая строка9,7,7,2,9
и сумма59
. И так далееОтветы:
MATL , 16 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Рассмотрим в качестве примера
Код
&n:w:!Xl
строит вектор столбца и вектор[1; 2; 3; 4]
строки[1 2 3 4 5]
. ЗатемXl
вычисляется минимально поэлементно с трансляцией, которая дает матрицуX:
линеаризует эту матрицу (в главном порядке столбцов) в вектор столбцов[1; 1; 1; 1; 1; 2; 2; ... ; 4]
. Этот вектор и линеаризованная входная матрица, полученные какGX:
, передаются как входные данные дляaccumarray(... @sum)
функции, или1XQ
. Это вычисляет сумму второго входа, сгруппированного по значениям первого входа.источник
Желе , 3 байта
Попробуйте онлайн!
Как это работает
источник
CJam ,
2318 байтАнонимный блок, ожидающий аргумент в стеке и оставляющий результат в стеке.
Попробуйте онлайн!
объяснение
источник
q~[{(:+\z}h;]2/::+p
[
. Но как блок я думаю, что он мне нужен, потому что он не должен захватывать весь стек ниже.05AB1E ,
1411 байтовПопробуйте онлайн!
объяснение
источник
JavaScript (ES6), 60 байт
Наивное решение, может быть, лучше.
источник
Mathematica, 60 байт
Вдохновленный ответом MATL Луиса Мендо .
Объяснение:
Min~Array~Dimensions@#
строит матрицу, как показано ниже:Затем
Pick[#,...,n]~Total~2
выбирает записи входной матрицы, соответствующие числуn
в странной матрице выше, и суммирует их. Наконец...~Table~{n,Min[d=Dimensions@#]}
перебираетn
.Это на 1 байт короче наивного подхода:
источник
Haskell,
5049 байтовПопробуйте онлайн!
Если есть хотя бы одна строка с хотя бы одним элементом, результатом является сумма первой строки и заголовков всех других строк, за которыми следует рекурсивный вызов с хвостами всех других строк. Во всех остальных случаях результатом является пустой список.
Редактировать: Эрджан Йохансен сохранил байт. Благодарность!
источник
Октава ,
6452 байтаСпасибо @StewieGriffin за сохранение 1 байта!
Это определяет анонимную функцию.
Попробуйте онлайн!
объяснение
Код похож на мой ответ MATL (см. Объяснение там).
Два байта были сохранены с использованием
1:size(x)
вместо1:size(x,1)
, используя тот факт, что1:[a b]
ведет себя так же, как1:a
. Кроме того, один байт был сохранен с использованием1:rows(x')
вместо1:size(x,2)
, благодаря Stewie.источник
к, 19 байт
Попробуйте онлайн!
Объяснение:
источник
05AB1E , 16 байтов
Попробуйте онлайн! или попробуйте все тесты
источник
Октава ,
6360 байтПопробуйте онлайн!
Ответ для этой матрицы:
вектор суммы строк в его верхней треугольной части:
плюс вектор сумм столбцов его нижней треугольной части:
это именно то, что мой ответ вычисляет.
источник
Юлия , 62 байта
Работает рекурсивно, суммируя всю матрицу, а затем вычитая сумму следующего блока. Вероятно, не самый эффективный подход, но приятно интуитивно понятный.
источник
Java 7, 248 байт
Попробуй это здесь.
Общее объяснение:
Допустим, входной массив имеет размеры 4х6. Первая часть кода создаст временную матрицу и заполняет ее следующим образом:
А во второй части кода он будет зацикливаться на этой временной матрице и суммирует все значения входной матрицы для каждого из отдельных чисел в временной матрице.
Пояснение к коду:
источник
Perl 6 ,
6355 байт{($_ Z [Z] $_).kv.map(->\a,\b{b.flatmap(*[a..*]).sum -b[0;a]})}
$_
матричный вход для анонимной функции.skip
является входной матрицей с удаленной первой строкой[Z] .skip
транспонирование входной матрицы с удаленной первой строкой; то есть транспонирование без первого столбца$_ Z [Z] .skip
архивирует входную матрицу с помощью transpose-sans-first-column, создавая список((first-row, first-column-sans-first-element), (second-row, second-column-sans-first-element), ...)
.kv
префиксы каждой пары с ее индексомmap({...})
сопоставляет пары, используя функцию, которая принимает свой первый аргумент (индекс)$^a
и второй (пара строка / столбец) в$^b
$^b.flatmap(*[$^a..*]).sum
убирает первые$^a
элементы каждой пары строка / столбец, затем суммирует все оставшиеся элементыПосле некоторых размышлений я понял, что удаление первого столбца транспонирования перед сжатием было эквивалентно вычитанию дважды вносящих диагональные элементы, как в моем первом решении. Это позволило мне удалить это вычитание, и использование каждого аргумента для функции отображения только один раз сделало
{...$^a...$^b...}
метод передачи аргументов анонимной функции более эффективным, чем оригинал-> \a, \b {...a...b...}
.источник
Vim,
66, 52 байтаПопробуйте онлайн!
Неправильный инструмент для работы ...
источник
Желе , 10 байт
Полная программа, которая печатает значения
Попробуйте онлайн!
Как?
источник
Python + NumPy, 75 байт
Ввод представляет собой двумерный массив.
Попробуйте онлайн
источник
Python 2 , 97 байт
Попробуйте онлайн!
источник
Pyth,
1615 байтПринимает массив чисел в стиле python, возвращает массив сумм.
Попытайся!
объяснение
источник
GNU APL 1.7, 123 байта
Для решения требуются две функции: одна создает глобальный массив и вызывает вторую, которая рекурсивно добавляет суммы к этому массиву.
∇
начинается и заканчивается функция. И те,f
и другиеg
принимают в качестве аргументов таблицы (по сути, двумерные массивы). Они могут быть созданы сX←rows cols ⍴ 1 2 3 4...
.R←⍬
назначает пустой вектор глобальной переменнойR
.g N
вызывает вторую функцию с тем же аргументом, что и первый.⍴N
дает размерыN
; когда одно из измерений равно нулю, больше нет строк / столбцов для добавления.0∈⍴N
возвращает 1, если в измерениях есть ноль.→2+2×0∈⍴N
переход к строке № 2 плюс 2-кратное возвращаемое значение∈
функции: если нуля нет,∈
возвращается 0, и функция переходит к строке 2 (следующая строка). Если это ноль,∈
возвращается 1 и функция переходит к строке 4 (конец функции, так что поreturn
существу)./
является оператором сокращения. Он применяет левый аргумент, который является оператором (+
), к каждому элементу в списке, указанному в качестве правого аргумента.N[1;]
дает всю первую строку таблицы иN[;1]
дает первый столбец.(+/N[1;])+(+/N[;1])-N[1;1]
суммирует первую строку и столбец и вычитает значение в верхнем левом углу, поскольку оно добавляется как в сумму столбца, так и в сумму строки.R←R,...
добавляет новое вычисленное значение к глобальному векторуR
.Затем функция вызывает сама себя (повторяется до тех пор, пока не останется больше строк или столбцов) Оператор
⊃
выбора получает указанный элемент из списка.1⊃⍴N
дает количество строк,2⊃⍴N
количество столбцов.⍳
дает все числа от 1 до указанного числа.↓
Оператор капли удаляет элементы из начала списка. Если вы даете несколько индексов при доступе к элементам из таблицы или вектора (напримерN[1 2 3]
), APL обращается к каждому из них. Таким образом,1↓⍳1⊃⍴N
дает индексы каждой строки, исключая первый (2, 3, 4, ..., N
) и1↓⍳2⊃⍴N
дает аналогичный вектор, но для столбцов.g N[1↓⍳1⊃⍴N;1↓⍳2⊃⍴N]
вызывает функцию снова, но без первой строки или столбца.источник
PHP, 76 байт
Попробуйте онлайн!
источник
Mathematica, 116 байт
Форма ввода
источник
Clojure, 98 байт
Перебирает ввод с индексами строк и столбцов (очень многословно), создает хеш-карту с минимумом
i
иj
в качестве ключа, объединяет хеш-карты с+
отсортированной картой, возвращает значения.источник
R, 102 байта
возвращает анонимную функцию; выводит результаты на консоль с завершающим переводом строки. Мне, наверное, нужен другой подход.
Перебирает минимум строк и столбцов; печатает сумму
x[,1]
(первый столбец) иx[1,-1]
первую строку, за исключением первой записи, затем устанавливаетx
в качестве матрицы, равнойx[-1,-1]
(т.е.x
исключая ее первую строку и столбец). К сожалению, простая установкаx=x[-1,-1]
приводит к сбою в случае квадратной матрицы, потому что, когдаx
2x2, подмножество возвращает вектор, а не матрицу.Попробуйте онлайн!
источник
Java 7,
280276 байтПопробуй это здесь.
Альтернативный подход по сравнению с моим предыдущим ответом с массивами, который все же короче, чем этот в конце (так что я потратил немного времени, пытаясь использовать этот альтернативный подход).
Общее объяснение:
Вдохновение от @Riley удивительном 05AB1E ответа «S
Этот ответ использует список и после того, как каждая сумма рассчитывается она удаляет первый столбец и первую строку из списка-матрицы, как это:
Пояснение к коду:
источник
Python, 93 байта
Аналогично ответу mbomb007, но без NumPy
источник