Вам дан многомерный массив целых чисел. Каждое измерение имеет фиксированный размер (чтобы оно всегда было прямоугольным, если оно 2D). Ваша программа должна рассчитать суммы в каждом измерении и добавить суммы в качестве новых последних элементов в этом измерении.
Предположим, что входными и выходными массивами являются A и B, а размер измерения i для A равен n i . B будет иметь то же число измерений, что и A, а размер измерения i будет n i +1. B j 1 , j 2 , ..., j m - сумма A k 1 , k 2 , ..., k m, где:
- k i = j i, если j i <= n i
- 0 <k i <= n i, если j i = n i +1
Для ввода:
[[1 2 3]
[4 5 6]]
Ваша программа (или функция) должна вывести:
[[1 2 3 6]
[4 5 6 15]
[5 7 9 21]]
Вход содержит только массив. Общее количество измерений и размер каждого измерения не указаны во входных данных. (Но вы можете получить их из массива с помощью собственного кода.) Вы можете использовать любые удобные форматы списков на вашем языке, если только они не указывают количество измерений или размеры измерений напрямую.
Вход имеет по крайней мере 1 измерение и имеет как минимум 1 элемент в массиве.
Это код-гольф. Самый короткий код выигрывает.
Контрольные примеры
Input:
[5 2 3]
Output:
[5 2 3 10]
Input:
[[1 2 3] [4 5 6]]
Outputs:
[[1 2 3 6] [4 5 6 15] [5 7 9 21]]
Input:
[[[1] [1] [1] [0]]]
Output:
[[[1 1] [1 1] [1 1] [0 0] [3 3]] [[1 1] [1 1] [1 1] [0 0] [3 3]]]
Input:
[[[[-1]]]]
Output:
[[[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]] [[[-1 -1] [-1 -1]] [[-1 -1] [-1 -1]]]]
источник
Ответы:
J, 14 байт
Использование:
Функция эквивалентна следующему,
(0|:],+/)^:(#@$)
но использует определяемое пользователем наречие для сохранения слов.Объяснение последнего кода справа налево:
^:(#@$)
повторите^:
для количества#
измерений$
:],+/
сцепить,
к аргументу]
с суммой его на последнее измерение+/
0|:
повернуть размеры|:
, поместив первый0
в конец списка измеренийПосле выполнения описанной выше процедуры мы возвращаем исходный ввод с суммами по всем измерениям.
Для моего более старого решения проверьте историю изменений.
Попробуйте это онлайн здесь.
источник
Mathematica,
3220 байтПример:
Объяснение:
Полная форма
{{1, 2, 3}, {4, 5, 6}}
естьList[List[1, 2, 3], List[4, 5, 6]]
. Затем замените всеList
s в выражении на функцию({##,+##}&)
.источник
Python 2, 95 байт
Это перебирает все измерения, объединяя их суммы, используя NumPy.
Я наткнулся на NumPy
r_
, что довольно здорово для игры в гольф.r_[:n]
корочеrange(n)
и намного мощнее (напримерr_[:4, 7, 8, 10:100:10]
). Он также может выполнять другие функции, такие как конкатенация по произвольной оси.Пример использования:
источник
APL,
1615 байтСпасибо @ user23013 за вывод 3 байта и определение правильного формата ввода.
Проверьте контрольные примеры онлайн с TryAPL .
идея
Общая идея та же, что и в моем представлении CJam, для которого APL допускает гораздо более короткую реализацию. Он состоит всего из двух шагов:
Суммируйте массив по его внешнему измерению.
Повторите шаг 1 для каждого подмассива.
Код
источник
,⊂(,1)(,1)(,1)(,0)
и,⊂,⊂,⊂,¯1
соответственно. Таким образом, вы можете удалить другого персонажа.Пип ,
1815 байтЭто анонимная функция, которая принимает массив в качестве аргумента и возвращает результат. Пример вызова с использованием
-p
флага для получения читабельного вывода:Идея в основном такая же, как и у Денниса , но независимо полученная. Более конкретно:
Этот метод работает, потому что
+
(наряду со многими другими операторами) функционирует поэтапно в списках в Pip - функция, основанная на языках программирования массивов, таких как APL. Поэтому, когда вам$+
нравится список[[1 2 3] [4 5 6]]
, результат будет[5 7 9]
желаемым. Также используется в тесте со списком или скаляром:[1 2 3] - [1 2 3]
дает[0 0 0]
, что верно (как и все списки, кроме пустого списка).Предыдущая 18-байтовая версия:
Изменения:
[1 2 3] != 123
);M
имеют более низкий приоритет, чем?
(хотя я, вероятно, собираюсь это изменить, особенно сейчас): без них код будет анализироваться как(Ja=a?af)M(aAE$+a)
, что приведет к причудливым сообщениям об ошибках. Тем не менее, средний аргумент троичного оператора может быть любым выражением любого приоритета, без скобок. Таким образом, сделав список правдивым, я могу сохранить эти два байта.источник
APL (25)
Массивы APL имеют встроенные измерения, так что это функция, которая принимает n- мерный массив и затем суммирует по каждому измерению.
Объяснение:
N←⍵
: сохранить массив вN
.⍴⍴N
: получить количество измеренийN
. (⍴
дает размеры, т.е.⍴↑(1 2 3)(4 5 6)
дает2 3
, поэтому⍴⍴
дает размеры измерений.){
...}¨⍳
: для каждого номера от 1 до⍴⍴N
:+/[⍵]N
: суммаN
по измерению⍵
N,[⍵]←
: присоединить результат кN
в этом измеренииN
: наконец, вернитесьN
.источник
↑(1 2 3)(4 5 6)
делает, это просто строит 2-мерный массив из 2 1-мерных, используя↑
. Это не встроенная запись, и она не обобщает то, как вы могли бы думать. Канонический способ построения 3-го и 4-го массивов был бы1 4 1⍴1 1 1 0
и1 1 1 1⍴¯1
, но также возможно построить их без ссылки на размеры, например, третий массив также может быть↑⍉⍪(,1)(,1)(,1)(,0)
создан с , четвертый может быть создан с↑⍪⊂⍪¯1
.f←{0=≡⍵:⍵⋄f¨⍵,+/⍵}⋄f((1 2)(3 4))((5 6)(7 8))
), но кажется, что вложенные векторы и массивы отличаются, и первый не отличает скаляры от синглетонов ...{×≡⍵:∇¨⍵,+/⍵⋄⍵}((1 2)(3 4))((5 6)(7 8))
. Исправлено:{×⍴⍴⍵:∇↓⍵,+/⍵⋄⍵}1 4 1⍴1 1 1 0
. Теперь он короче, чем Mathematica ...CJam, 36 байт
Это рекурсивная именованная функция, которая извлекает массив из стека и оставляет один взамен.
Попробуйте тестовые случаи в интерпретаторе CJam .
идея
К сожалению, в CJam нет некоторого автоматического оператора, который позволяет добавлять произвольно вложенные массивы, поэтому мы должны реализовать его самостоятельно. К счастью, это делает два инфиксных оператора,
:
(уменьшить) и.
(векторизируют), которые окажутся полезными для этой задачи.Шаг первый - вычисление количества измерений. Это легко: преобразовать массив в его строковое представление и посчитать количество ведущих [ 's.
Теперь, чтобы уменьшить массив из одного измерения, вы обычно просто выполняете
:+
:Для массива двух измерений
+
будет выполнять конкатенацию вместо сложения, поэтому мы должны векторизовать его:Теперь для массива из трех измерений он
.+
будет работать с массивами из двух измерений и снова выполнять конкатенацию. На этот раз мы должны векторизовать.+
:Для общего случая, массива размерности D , мы должны объединить в цепочку один
:
, D - 1.
и один+
.Конечно, это только суммирует массив только через его крайнее измерение. Мы можем решить это, определив функцию S которая вычисляет размерность (и ничего не делает, если она равна нулю), выполняет сумму, как указано выше, и, наконец, применяет себя к элементам массива.
Код
источник
Рубин (
181139119108 байт)Предполагается, что ввод передается как JSON.
источник
d
в этом ответе учитывается только 95 байтов .Java, 669 байт
не буду врать, я очень горжусь собой за это: p
расширен с тестированием:
запуск расширенной тестовой версии печатает это:
источник