Сумма реплицированных матриц


11

Учитывая список чисел [ a 1 a 2 ... a n ] , вычислите сумму всех матриц Aᵢ, где Aᵢ определяется следующим образом ( m - максимум всех aᵢ ):

       1  2  ⋯ (i-1) i (i+1) ⋯  n
     +----------------------------
 1   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
 2   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
 .   . .  .      .   .   .      .
 .   . .  .      .   .   .      .
aᵢ   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
aᵢ₊₁ | 0  0  ⋯   0   0   0   ⋯  0
 .   . .  .      .   .   .      .
 .   . .  .      .   .   .      .
 m   | 0  0  ⋯   0   0   0   ⋯  0

пример

Учитывая вход, [2,1,3,1]мы строим следующую матрицу:

[2 2 2 2]   [0 1 1 1]   [0 0 3 3]   [0 0 0 1]   [2 3 6 7]
[2 2 2 2] + [0 0 0 0] + [0 0 3 3] + [0 0 0 0] = [2 2 5 5]
[0 0 0 0]   [0 0 0 0]   [0 0 3 3]   [0 0 0 0]   [0 0 3 3]

Правила и ввод / вывод

  • Вы можете предположить, что ввод не пуст
  • Вы можете предположить, что все входы неотрицательны (0≤)
  • входными данными могут быть матрица 1 × n (или n × 1), список, массив и т. д.
  • аналогичным образом вывод может быть матрица, список списков, массив и т. д.
  • Вы можете принимать и возвращать входные данные через любой формат ввода / вывода по умолчанию
  • ваша заявка может быть полной программой или функцией

Контрольные примеры

[0] -> [] or [[]]
[1] -> [[1]]
[3] -> [[3],[3],[3]]
[2,2] -> [[2,4],[2,4]]
[3,0,0] -> [[3,3,3],[3,3,3],[3,3,3]]
[1,2,3,4,5] -> [[1,3,6,10,15],[0,2,5,9,14],[0,0,3,7,12],[0,0,0,4,9],[0,0,0,0,5]]
[10,1,0,3,7,8] -> [[10,11,11,14,21,29],[10,10,10,13,20,28],[10,10,10,13,20,28],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,10,18],[10,10,10,10,10,10],[10,10,10,10,10,10]]

Я предполагаю, что есть разница в шрифте или что-то. Я вижу, вы откатили мою правку. Вот как это выглядит в настоящее время. Imgur.com/a06RH9r Это Chrome в Windows 10. Вертикальные эллипсы по какой-то причине не отображаются в моноширинном пространстве и не совпадают с колонками. Вот почему я изменил это. Но я думаю, это должно выглядеть по-разному в разных средах.
рекурсивный

1
Определенно проблема со шрифтом. Обе ревизии смещены на моем экране.
Деннис

Можем ли мы вернуть результат транспонированным?
Адам


1
@ Adám: Я собираюсь сказать нет, но не стесняйтесь включить решение в ваш пост, который делает это.
ბიმო

Ответы:


9

Желе , 10 5 байт

ẋ"z0Ä

Попробуйте онлайн!

Как это работает

ẋ"z0Ä  Main link. Argument: A (array)


       e.g. [2, 1, 3, 1]

ẋ"     Repeat each n in A n times.

       e.g. [[2, 2   ]
             [1      ]
             [3, 3, 3]
             [1      ]]

  z0   Zipfill 0; read the result by columns, filling missing elements with 0's.

        e.g. [[2, 1, 3, 1]
              [2, 0, 3, 0]
              [0, 0, 3, 0]]

    Ä  Take the cumulative sum of each row vector.

       e.g. [[2, 3, 6, 7]
             [2, 2, 5, 5]
             [0, 0, 3, 3]]

4

R , 80 байт

n=sum((a=scan())|1);for(i in 1:n)F=F+`[<-`(matrix(0,max(a),n),0:a[i],i:n,a[i]);F

Попробуйте онлайн!

Принимает входные данные от стандартного ввода; печатает 0x1матрицу для ввода 0, которая печатает как

	[,1]


3
Для тех, кто интересуется, Fэто встроенная глобальная переменная, начальное значение которой равно FALSE. Здесь он приводится к 0 и используется в качестве начального значения кумулятивной суммы. Этот ответ демонстрирует причину не использовать Fи Tза исключением кода, специально разработанного, чтобы никогда не использоваться на самом деле!
НГМ



3

APL (Dyalog Unicode) , 8 байтов SBCS

Полная программа. Запрашивает stdin для списка, печатает матрицу на стандартный вывод.

Использует метод Денниса .

+\⍉↑⍴⍨¨⎕

Попробуйте онлайн!

 STDIN

⍴⍨¨r eshape-селфи каждого

 смешать список списков в матрицу, заполнив нулями

 транспонирования

+\ накопленная построчная сумма

Это не имеет никакого значения для вычислений, поэтому его можно было бы опустить и \изменить на сумму по столбцам, а не по строкам.



2

Октава , 64 байта

@(x,k=a=0*(x+(1:max(x))'))eval"for i=x;a(1:i,++k:end)+=i;end,a";

Попробуйте онлайн!

Объяснение:

Еще раз: выражения в списке аргументов и eval используются в одной функции :)

Он принимает в xкачестве входных данных и создает две одинаковые матрицы, заполненные нулями, с размерами k=a=zeros(length(x),max(x)). Это достигается путем добавления горизонтального вектора xс вертикальным вектором с 1:max(x)неявным расширением размеров до двумерного массива, а затем умножения его на ноль. ~(x+...)к сожалению, не работает, так как это заставляет aбыть логическим массивом в остальной части функции.

for i=xэто цикл, который для каждой итерации делает i=x(1), то i=x(2)и так далее. a(1:i,k++:end)является частью матрицы, которая должна обновляться для каждой итерации. 1:iвектор, указывающий, какие строки должны быть обновлены Если i=0, то это будет пустой вектор, поэтому ничего не будет обновлено, иначе это так 1, 2 .... ++k:endувеличивает kматрицу на единицу и создает диапазон от первого значения этой матрицы ( 1,2,3...) до последнего столбца aматрицы. +=iдобавляет текущее значение к a. end,aзавершает цикл и выводит a.




1

Java 10, 142 байта

a->{int l=a.length,i=0,j,s,m=0;for(int q:a)m=q>m?q:m;int[][]r=new int[m][l];for(;i<m;i++)for(j=s=0;j<l;j++)r[i][j]=s+=i<a[j]?a[j]:0;return r;}

Попробуйте онлайн.

a->{               // Method with integer-array parameter and integer-matrix return-type
  int l=a.length,  //  Length of the input-array
      i,j,         //  Index integers
      s,           //  Sum integer
  m=0;for(int q:a)m=q>m?q:m;
                   //  Determine the maximum of the input-array
  int[][]r=new int[m][l];
                   //  Result-matrix of size `m` by `l`
  for(;i<m;i++)    //  Loop `i` over the rows
    for(j=s=0;     //   Reset the sum to 0
        j<l;j++)   //   Inner loop `j` over the columns
      r[i][j]=s+=  //    Add the following to the sum `s`, add set it as current cell:
        i<a[j]?    //     If the row-index is smaller than the `j`'th value in the input:
         a[j]      //      Add the current item to the sum
        :          //     Else:
         0;        //      Leave the sum the same by adding 0
  return r;}       //  Return the result-matrix


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.