Сума повторюваних матриць


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

Спробуйте в Інтернеті!

Бере вхід від stdin; друкує а0x1 матрицю для введення 0, яка друкує як

	[,1]


3
Для тих, хто цікавиться, Fце вбудована глобальна змінна, початкове значення якої FALSE. Тут він примусовий до 0 і використовується як початкове значення сукупної суми. Ця відповідь показує причину не використовувати Fі Tкрім як в коді спеціально розроблений , щоб ніколи не бути на самому справі використовується!
ngm



3

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

Повна програма. Підказує stdin для списку, друкує матрицю до stdout.

Використовує метод Денніса .

+\⍉↑⍴⍨¨⎕

Спробуйте в Інтернеті!

 stdin

⍴⍨¨r eshape-selfie кожного

 змішати список списків у матрицю, заповнюючи 0

 переносити

+\ сукупна рядкова сума

Це не робить жодних обчислювальних різниць, тому потенційно його можна буде залишити та \змінити на підсумок у стовпцях, а не на рядках.



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), неявно розширюючи розміри на 2D-масив, а потім помножуючи його на нуль. ~(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.