Suma replikowanych macierzy

11

Biorąc pod uwagę listę liczb [ a 1 a 2 ... a n ] , oblicz sumę wszystkich macierzy Aᵢ, gdzie Aᵢ jest zdefiniowane w następujący sposób ( m jest maksimum wszystkich 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

Przykład

Biorąc pod uwagę dane wejściowe, [2,1,3,1]tworzymy następującą macierz:

[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]

Reguły i I / O

  • możesz założyć, że dane wejściowe nie są puste
  • możesz założyć, że wszystkie dane wejściowe są nieujemne (0 ≤)
  • wejściem może być macierz 1 × n (lub n × 1), lista, tablica itp.
  • podobnie wyjście może stanowić macierz, lista list, tablica itp.
  • możesz pobierać i zwracać dane wejściowe za pomocą dowolnego domyślnego formatu we / wy
  • Twoje zgłoszenie może być pełnym programem lub funkcją

Przypadki testowe

[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]]
ბიმო
źródło
Domyślam się, że istnieje różnica między czcionkami lub coś takiego. Widzę, że wycofałeś moją edycję. Tak mi obecnie wygląda imgur.com/a06RH9r To jest Chrome w systemie Windows 10. Pionowe elipsy z jakiegoś powodu nie są renderowane w przestrzeni kosmicznej i nie są wyrównane z kolumnami. Dlatego to zmieniłem. Ale myślę, że musi wyglądać inaczej w różnych środowiskach.
rekurencyjne
1
Zdecydowanie problem z czcionkami. Obie wersje są źle wyrównane na moim ekranie.
Dennis
Czy możemy zwrócić transponowany wynik?
Adám
1
@ Adám: Powiem „nie”, ale możesz dodać rozwiązanie, które to zrobi.
ბიმო

Odpowiedzi:

9

Galaretka , 10 5 bajtów

ẋ"z0Ä

Wypróbuj online!

Jak to działa

ẋ"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]]
Dennis
źródło
4

R , 80 bajtów

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

Wypróbuj online!

Pobiera dane wejściowe ze standardowego wejścia; wypisuje 0x1macierz wejściową 0, która wypisuje się podobnie

	[,1]

Giuseppe
źródło
3
Dla tych, którzy zastanawiają się, Fjest wbudowana zmienna globalna, której wartość początkowa to FALSE. Tutaj jest wymuszone na 0 i użyte jako wartość początkowa sumy skumulowanej. Ta odpowiedź pokazuje powód, aby nie używać Fi Toprócz kodu nigdy specjalnie zaprojektowany, aby być rzeczywiście używane!
ngm
4

Haskell , 70 66 51 bajtów

g x=[scanl1(+)[sum[n|n>=r]|n<-x]|r<-[1..maximum x]]

Wypróbuj online!

Laikoni
źródło
1
Jako łamigłówka dostępna jest wersja 54-bajtowa;)
ბიმო
1
@BMO A może zamiast 51 bajtów?
Laikoni
Bardzo dobrze! Mój był taki :)
ბიმო
3

JavaScript (ES6), 88 79 bajtów

Zwraca []za [0].

f=(a,y,b=a.map((_,x)=>a.map(c=>y>=c|x--<0?0:s+=c,s=0)|s))=>s?[b,...f(a,-~y)]:[]

Wypróbuj online!

Arnauld
źródło
3

APL (Dyalog Unicode) , 8 bajtów SBCS

Pełny program Monituje stdin o listę, drukuje matrycę na standardowe wyjście.

Wykorzystuje metodę Dennisa .

+\⍉↑⍴⍨¨⎕

Wypróbuj online!

 standardowe

⍴⍨¨r eshape-selfie każdego

 zmieszaj listę list w macierz, wypełniając 0

 transponować

+\ skumulowana suma wierszy

Nie robi to żadnej różnicy obliczeniowej, więc potencjalnie można go pominąć i \zmienić na sumowanie kolumnowe zamiast wierszowe.

Adám
źródło
2

Python 2 , 85 bajtów

lambda x:[[sum(n*(n>j)for n in x[:i+1])for i in range(len(x))]for j in range(max(x))]

Wypróbuj online!

Pręt
źródło
2

Oktawa , 64 bajty

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

Wypróbuj online!

Wyjaśnienie:

Jeszcze raz: Wyrażenia z listy argumentów i eval są używane w jednej funkcji :)

Pobiera to xdane wejściowe i tworzy dwie identyczne macierze wypełnione zerami o wymiarach k=a=zeros(length(x),max(x)). Osiąga się to poprzez dodanie wektora poziomego xz wektorem pionowym z 1:max(x), niejawne rozszerzenie wymiarów do tablicy 2D, a następnie pomnożenie tego przez zero. ~(x+...)nie działa niestety, ponieważ to wymuszaa to bycie logiczną tablicą przez resztę funkcji.

for i=xto pętla, która tworzy dla każdej iteracji i=x(1), wtedy i=x(2)i tak dalej. a(1:i,k++:end)jest częścią macierzy, którą należy aktualizować dla każdej iteracji. 1:ito wektor informujący, które wiersze należy zaktualizować. Jeśli i=0, to będzie to pusty wektor, więc nic nie zostanie zaktualizowane, w przeciwnym razie będzie 1, 2 .... ++k:endzwiększa kmacierz o jeden i tworzy zakres od pierwszej wartości tej macierzy ( 1,2,3...) do ostatniej kolumny amacierzy. +=idodaje bieżącą wartość do a. end,akończy pętlę i wyjścia a.

Stewie Griffin
źródło
1

Java 10, 142 bajty

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;}

Wypróbuj online.

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
Kevin Cruijssen
źródło
1

Pari / GP , 60 bajtów

a->matrix(vecmax(a),#a,i,j,vecsum([a[k]|k<-[1..j],a[k]>=i]))

Wypróbuj online!

alephalpha
źródło