복제 된 행렬의 합


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]

규칙 및 I / O

  • 입력이 비어 있지 않은 것으로 가정 할 수 있습니다
  • 모든 입력이 음이 아닌 것으로 가정 할 수 있습니다 (0≤)
  • 입력은 1xn (또는 nx1) 행렬, 목록, 배열 등이 될 수 있습니다.
  • 마찬가지로 출력은 행렬, 목록 목록, 배열 등이 될 수 있습니다.
  • 기본 I / O 형식을 통해 입력을 가져오고 반환 할 수 있습니다.
  • 귀하의 제출물은 전체 프로그램 또는 기능 일 수 있습니다

테스트 사례

[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 이 수직 타원은 어떤 이유로 고정 폭 렌더링하지 않는 Windows 10에 크롬을, 그리고 열이 정렬되지 않습니다. 그래서 내가 바꿨습니다. 그러나 다른 환경에서는 다르게 보일 것입니다.
재귀

1
확실히 글꼴 문제입니다. 화면에서 두 개정판이 잘못 정렬되었습니다.
Dennis

전치 된 결과를 반환해도됩니까?
Adám


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에서 입력을받습니다. 0x1input에 대한 행렬을 0인쇄합니다.

	[,1]


3
궁금한 사람들을 위해 F초기 값이 인 내장 전역 변수가 FALSE있습니다. 여기서는 0으로 강제 변환되고 누적 합계의 초기 값으로 사용됩니다. 이 답변은 사용하지 않을에 대한 이유를 보여줍니다 FT코드에서 특별히 실제로 사용되는 결코 설계하지 제외를!
ngm



3

APL (Dyalog Unicode) , 8 바이트 SBCS

전체 프로그램. stdin에 list를 요청하고 행렬을 stdout에 인쇄합니다.

Dennis의 방법을 사용합니다 .

+\⍉↑⍴⍨¨⎕

온라인으로 사용해보십시오!

 stdin

⍴⍨¨R의 각 eshape-셀카

 목록을 행렬로 혼합하여 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입력으로 취해 치수로 0으로 채워진 두 개의 동일한 행렬을 만듭니다 k=a=zeros(length(x),max(x)). 이를 위해 수평 벡터에 x와 함께 수직 벡터를 추가하고 1:max(x)차원을 2D 배열로 암시 적으로 확장 한 다음이 값에 0을 곱하면됩니다. ~(x+...)불행히도 작동하지 않습니다. 왜냐하면 a나머지 함수 전체에서 논리적 배열이되어야하기 때문입니다 .

for i=x루프 각 반복이 만드는 동안 그 i=x(1)다음, i=x(2)등등. a(1:i,k++:end)각 반복에 대해 업데이트해야하는 행렬의 일부입니다. 1:i어떤 행을 업데이트해야하는지 나타내는 벡터입니다. 인 i=0경우이 값은 빈 벡터이므로 아무것도 업데이트되지 않습니다. 그렇지 않으면 1, 2 ...입니다. 행렬을 1 ++k:end씩 증가시키고이 k행렬의 첫 번째 값 ( 1,2,3...)부터 행렬 의 마지막 열까지 의 범위를 만듭니다 a. +=i현재 값을에 추가합니다 a. end,a루프를 종료하고 출력 a합니다.




1

자바 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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.