Возьмите матрицу положительных целых чисел в качестве входных данных и выведите отдельные суммы элементов по диагональным линиям через матрицу.
Вы должны считать только линии, идущие по диагонали вниз и вправо. Вы должны начать с диагонали, которая содержит только нижний левый элемент, затем диагональ на две длины выше этой (если она существует) и так далее до диагонали, которая содержит только верхний правый элемент, как показано ниже.
Пример:
Input:
8 14 5 1
10 5 5 8
6 6 8 10
15 15 4 11
Output:
15, 21, 20, 32, 29, 13, 1
(Diagonals: {{15},{6,15},{10,6,4},{8,5,8,11},{14,5,10},{5,8},{1}})
Input:
1
Output:
1
Input:
1 5
Output:
1, 5
Input:
4
1
Output:
1, 4
Input:
17 4 5
24 16 5
9 24 10
1 14 22
1 21 24
4 4 17
24 25 17
Output:
24, 29, 22, 39, 47, 70, 43, 9, 5
Форматы ввода и вывода необязательны, как всегда.
Это код-гольф , поэтому выигрывает самая короткая подача на каждом языке.
Ответы:
Haskell ,
4037 байтПопробуйте онлайн! Использование:
(foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]]
.Редактировать: Спасибо Орджану Йохансену за -3 байта!
Ungolfed:
z
список бесконечно многих нулей Вf
мы сгиб список списковm
путем объединения двух списков с помощью функции#
. В#
первом спискеs
содержатся накопленные суммы столбцов, а во втором спискеt
- новая строка, которая должна быть добавлена. Мы сдвигаемs
один элемент вправо, добавляя ноль к переднему и поэлементному добавлениюs
иt
сzipWith(+)
. Так какs
могут быть сколь угодно большими, мы должны дополнить ихt
достаточным количеством нулейz
.источник
foldl1$(.(++z)).zipWith(+).(0:)
.Mathematica,
5354 байтаЧистая функция, принимающая 2D-массив в качестве входных данных и возвращающая список. (Записи не должны быть целыми или четными числами.)
Diagonal[#,k]
Возвращаетk
диагональ th выше (или ниже, еслиk
она отрицательна) главной диагонали.{k,-l@#,l@#&@@#}
вычисляет диапазон диагоналей, необходимых на основе размеров входного массива. ИTr
суммирует записи каждой диагонали.источник
Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
MATL , 6 байтов
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
s==sum(x(:))
, а не придерживаться соглашения MATLAB, как это делает MATL?sum(x)
иsum(x,1)
. Для матрицыx
факт, которыйsum(x)
ведет себя по-разному, если матрица имеет 1 строку, иногда раздражает. Но в конце концов я решил пойти с Matlab, чтобы два языка стали ближе; и добавить некоторыеfun(x,1)
функции для наиболее распространенных случаевЖеле , 5 байт
Попробуйте онлайн!
Как это устроено
источник
ŒD
?ŒD
странный порядок не позволил ему быть полезным.JavaScript (ES6),
6558 байтисточник
a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
CJam ,
2221 байтСохранено 1 байт благодаря Мартину Эндеру
Анонимный блок ожидает аргумент в стеке и оставляет результат в стеке.
Попробуйте онлайн!
Как это устроено
источник
05AB1E , 17 байт
Попробуйте онлайн!
объяснение
источник
J 7 байт
Попробуйте онлайн!
Это довольно просто:
Косые перевернутые линии являются диагоналями массива, так что это просто суммирование диагоналей.
источник
Python 2 , 62 байта
Попробуйте онлайн!
источник
Желе , 8 байт
Попробуйте онлайн!
Половина кода используется, чтобы расположить результаты в правильном порядке.
Как?
источник
Perl 5, 47 байт
источник
R, 45 байт
Безымянная функция, принимающая объект класса матрицы в качестве входных данных:
Используя идею, объясненную в этом ответе.
источник
unname
, но это отличное решение, несмотря ни на что!Октава, 71 байт
Предполагая, что матрица A, например:
Тогда мы имеем:
Обратите внимание, что транспонирование матрицы меняет порядок диагональных сумм, что позволило сэкономить всего два байта в цикле for.
Выход:
источник
[m,n]=size(A);for i=1:m+n-1,trace([zeros(m-1,m);A'](i:end,:)),end
экономит 6 байт. Octave может выполнять прямую индексацию и встроенные назначения. К сожалению, допускать, что переменная существует в рабочем пространстве до запуска кода, не разрешено, поэтому я думаю, что вы должны использоватьinput
, как это, возвращая ее до 75 байт. Хороший подход, так что +1 от меня :) И добро пожаловать в PPCG! =)zeros(m-1,m)
можно записать~e(m-1,m)
, сохранив 4 байта :) Аккуратно, а?Python, 126 байт
f
работает только в нижней треугольной секции, поэтому я переношу ее и получу верхнюю треугольную секцию таким образом. Не знаю, почемуf
функция не работает для отрицательных значений (я изменил,f
чтобы быть короче, потому что часть, чтобы получить отрицательные значения не работали).источник
C, 148 байтов
Попробуйте онлайн
источник
PHP, 81 байт
Принять ввод как 2 D массив
Попробуйте онлайн!
источник
Awk, 67 байт
Ungolfed:
Awk разделяется на пробел
$n
- этоn
поле (с 1 индексом);NF
это количество полей в строке,NR
это номер текущей строки. Неопределенные переменные равны 0 и создаются при первом использовании.источник
PHP, 86 байт
дружественное к памяти решение в двух вариантах:
принимает входные данные из параметров скрипта, использует подчеркивание в качестве разделителя;
используйте настройки по умолчанию (не по умолчанию php.ini) или попробуйте их онлайн
источник
Clojure, 81 байт
Довольно многословно, поскольку в нем списки с нулями, так что мы можем просто вычислить сумму по столбцам.
источник
Mathematica 73 байта
Этот работает для ЛЮБОГО 2D-массива mxn (не только nxn),
ввод массива в конце кода, как это (последний тестовый пример)
ввод в форме [{a, b, c, d ...}, {m, n}]
источник