Для данной матрицы суммируйте ее значения вверх / вниз или влево / вправо, чтобы сформировать X, сложите ее и верните список. Я опишу алгоритм здесь:
Алгоритм
Ваш ввод будет квадратной матрицей нечетного размера целых чисел в пределах разумной числовой емкости вашего языка.
Давайте возьмем следующую матрицу в качестве примера:
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
Сначала добавьте каждое число к ближайшему числу, которое находится на главной диагонали или антидиагонале. То есть разделите матрицу на четыре секции вдоль главной диагонали и антидиагонали, а затем сложите все числа в каждой секции по направлению к центру, вот так:
1 2 3 2 1
↓ ↓ ↓
0 → 3 2 3 ← 0
↓
4 → 2 → 5 ← 6 ← 3
↑
7 → 4 7 9 ← 4
↑ ↑ ↑
0 6 7 2 5
Этот шаг дает следующий результат:
1 1
5 5
39
17 15
0 5
Затем мы складываем его, выравнивая X и переплетая элементы с верхним левым первым и нижним левым последним. Это дает следующий результат:
1, 0, 5, 17, 39, 5, 15, 1, 5
Вы можете представить это как растяжение главной диагонали и вращение против часовой стрелки.
Это конечный результат.
Вызов
Реализуйте этот алгоритм. Применяются стандартные лазейки. Все приемлемые форматы ввода / вывода приемлемы.
Тестовые случаи
Input
Output
1 2 3 2 1
0 3 2 3 0
4 2 5 6 3
7 4 7 9 4
0 6 7 2 5
1, 0, 5, 17, 39, 5, 15, 1, 5
1 2 3 4 5
5 4 3 2 1
1 3 5 7 9
0 9 8 7 6
6 7 8 9 0
1, 6, 11, 16, 47, 7, 22, 5, 0
1 3 7 4 8 5 3
8 4 7 5 3 8 0
0 6 3 6 9 8 4
2 6 5 8 7 4 2
0 6 4 3 2 7 5
0 6 7 8 5 7 4
8 5 3 2 6 7 9
1, 8, 15, 11, 23, 20, 62, 32, 25, 13, 18, 3, 9
Ответы:
JavaScript, 113 байт
Показать фрагмент кода
источник
~~
? Они нейтрализуют друг друга, поэтому в них нет необходимости.~~undefined==0
, так что это лучше, чем гольф(a[q]||0)
.undefined
. Когда я скопировал контрольный пример, используемый tsh , я заметил, что он работает без~~
. И поскольку~~x
подобное-(-x)
нейтрализует друг друга, я подумал, что это было каким-то образом помещено туда случайно. Спасибо за исправление.Желе ,
252321 байтПопробуйте онлайн!
Альтернативная версия, 19 байт
Это не использовалось для работы, потому что
Ġ
вел себя неправильно для вложенных массивов. Единственное отличие состоит в том, что пары [q, p], упомянутые в разделе « Как это работает» , сортируются лексикографически, а не отображаются в p + nq перед сортировкой.Попробуйте онлайн!
Фон
Начнем с замены его элементов координатами, увеличения влево и вниз и размещения (0, 0) в центре матрицы.
Для матрицы 7x7 M мы получаем следующие координаты.
Теперь мы вычисляем минимальное абсолютное значение каждой пары координат и умножаем на нее знаки обеих координат, сопоставляя (i, j) с (sign (i) m, sign (j) m) , где m = min (| i | , | j |) .
Матричные элементы, которые соответствуют одной и той же паре, должны суммироваться. Для того, чтобы определить порядок сумм, каждую пару (P, Q) , чтобы р + NQ , где п есть число строк / столбцов М .
Порядок сумм соответствует порядку целых чисел, соответствующих его слагаемым.
Как это устроено
источник
Python,
159158 байтПопробуйте онлайн!
источник
y+1+(y>l-2)
может быть(y>l-2)-~y
.Dyalog APL ,
10199646259 байт3 байта сохранены @ Adám
Попробуйте онлайн!
Используя потрясающий алгоритм Денниса .
источник
APL (Dyalog) , 60 байт *
В сотрудничестве с моим коллегой Маршаллом .
Анонимный префикс лямбда. Принимает матрицу в качестве аргумента и возвращает вектор. Предполагается
⎕IO
( I ndex O rigin) равным нулю, что по умолчанию во многих системах.Попробуйте онлайн!
{
...}
анонимная лямбда;⍵
Правильный аргумент (как самая правая буква греческого алфавита):⍴⍵
форма аргумента (список из двух одинаковых элементов)r←
сохранить какr
(как в r ho)⍳
все ɩ ndices массива такого размера, то есть(0 0)
,(0 1)
...i←
хранить вi
(как в i ota)=/¨
Булево, где координаты равны (то есть диагональ)(
…)
Применить эту анонимную функцию молчаливого префикса:⌽
изменить аргумент⊢∨
ИЛИ что с неизмененным аргументом,
Равель (выпрямить в простой список)Теперь у нас есть логическая маска для диагоналей.
(
…)/⍨
Используйте это для фильтрации следующего:⊢⍵
приводить (отделятьr
) от аргумента{
…}⌺r
Вызвать следующий анонимный лямбда-инфикс для каждого элемента,r
указав в качестве аргумента -neighbourhood (дополненный нулями⍵
), и список из двух элементов с числами, дополненными числом, столбцами (отрицательный для нижнего / правого, нулевой для нулевого) как левый аргумент (⍺
):r÷2
разделитьr
с двумя⊃
выбрать первый элемент (они идентичны)⌊
пол этоs←
сохранить какs
(для s hape)i∊⍨¨
для каждого элементаi
, логическое значение ifs
является его членом⍵×
умножить соседство с ним(
…)↓
Удалить следующее количество строк и столбцов (отрицательное для нижнего / правого):×⍺
Signum левого аргумента (то есть направление отступов)-
NEGATEs×
умножитьs
с этим,
Равель (выпрямить в список)+/
сумма (плюс уменьшение)Теперь у нас есть полная матрица сумм, но нам нужно отфильтровать все значения, считанные по столбцам.
⍉
транспонирования,
Равель (выпрямить в простой список)* Считая
⌺
как⎕U233A
. Попробуйте онлайн!источник