대각선 합


19

양의 정수로 된 행렬을 입력으로 취하고 행렬을 통해 대각선에 요소의 개별 합계를 출력하십시오.

대각선 아래로 오른쪽으로가는 선만 계산해야합니다. 아래 그림과 같이 왼쪽 아래 요소 만 포함 된 대각선으로 시작한 다음 그 위의 길이 두 대각선 (있는 경우) 등으로 시작해야합니다.

예:

Input:
 8   14    5    1
10    5    5    8
 6    6    8   10
15   15    4   11

Output:
15, 21, 20, 32, 29, 13, 1
(Diagonals: {{15},{6,15},{10,6,4},{8,5,8,11},{14,5,10},{5,8},{1}})

Input:
1
Output:
1

Input: 
1 5
Output:
1, 5

Input:
4
1

Output: 
1, 4

Input:
17    4    5
24   16    5
 9   24   10
 1   14   22
 1   21   24
 4    4   17
24   25   17

Output:
24, 29, 22, 39, 47, 70, 43, 9, 5

입력 및 출력 형식은 항상 선택 사항입니다.

이것은 이므로 각 언어에서 가장 짧은 제출이 이깁니다.


답변:


6

하스켈 , 40 37 바이트

z=0:z
foldl1$(.(++z)).zipWith(+).(0:)

온라인으로 사용해보십시오! 사용법 : (foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]].

편집 : -3 바이트 Ørjan Johansen에게 감사합니다!

언 골프 드 :

z = 0:z
s#t = zipWith(+)(0:s)(t++z)
f m = foldl1 (#) m

z무한히 많은 0의 목록입니다. 에서 f우리는 목록의 목록을 통해 배 m기능과 함께 두 목록을 결합하여 #. 에서는 #제리스트 s지금까지 축적 된 열의 합을 포함하고, 상기 제리스트 t에 추가되어야하는 새로운 행이다. 우리는 이동 s앞 요소 현명한 추가로 0을 추가하여 오른쪽으로 한 요소 st함께 zipWith(+). 때문에 s임의의 큰 수 있습니다, 우리는 패드가 t추가하여 충분한 제로로 z.


더 짧습니다 foldl1$(.(++z)).zipWith(+).(0:).
Ørjan Johansen

6

매스 매 티카, 53 54 바이트

l=Length@#-1&;Tr@Diagonal[#,k]~Table~{k,-l@#,l@#&@@#}&

2D 배열을 입력으로 받아서 목록을 반환하는 순수한 기능. (엔트리는 정수 또는 짝수 일 필요는 없습니다.) 주 대각선 위 (또는 음수 인 경우 아래)의 대각선을 Diagonal[#,k]반환합니다 . 입력 배열의 크기를 기준으로 필요한 대각선 범위를 계산합니다. 그리고 각 대각선의 항목을 합산합니다.kk{k,-l@#,l@#&@@#}Tr


동일한 바이트 수의 대안이지만 더 골프를 칠 수 있습니까? 그 괄호는 나빠 보입니다. Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
Martin Ender

5

MATL , 6 바이트

T&XdXs

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

T&Xd   % All diagonals of implicit input arranged as zero-padded columns
Xs     % Sum of each column. Implicitly display

궁금한 점이 있습니다 s==sum(x(:)). MATLAB이하는 것처럼 MATLAB 규칙을 따르는 대신 전체적으로 더 나은 것으로 생각하십니까?
Stewie Griffin

@StewieGriffin 나는 때때로 그것에 대해 생각했습니다. 내 의심은 ~ 사이 sum(x)sum(x,1)있었습니다. 행렬의 경우 행렬에 1 행이있는 경우 다르게 동작 x한다는 사실 sum(x)은 때때로 성가시다. 그러나 결국 나는 Matlab과 함께 가기로 결정했기 때문에 두 언어가 더 가깝습니다. fun(x,1)가장 일반적인 경우 에 몇 가지 기능 추가
Luis Mendo

5

젤리 , 5 바이트

0;+µ/

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

작동 원리

0;+µ/  Main link. Argument: M (matrix / array of rows)

   µ   Combine all links to the left into a chain (arity unknown at parse time) and
       begin a new monadic chain.
    /  Reduce M by that chain. This makes the chain dyadic.
       Let's call the arguments of the chain L and R (both flat arrays).
0;         Prepend a 0 to L.
  +        Perform element-wise addition of the result and R.
           When the chain is called for the n-th time, R has n less elements, so
           the last n elements of L won't have matching elements in R and will be
           left unaltered.

축소 할 첫 번째 R 만 하나의 요소가 적습니다. 각 행마다 하나 이상의 요소 씩 증가합니다.
Ørjan Johansen '

이건 그냥 영리하다 ... 아니 ŒD?
Outgolfer Erik

@EriktheOutgolfer 다시 한 번 ŒD이상한 주문으로 인해 유용하지 못했습니다.
데니스

@Dennis 그렇다면 나는 이상한 주문을하지 않은 무언가를 만들 것이라고 생각합니다 ... 오, 아마도 3 개의 모나드 들어오는 것일 수 있습니다.
아웃 골퍼 에릭

5

자바 스크립트 (ES6), 65 58 바이트

a=>a.map(b=>b.map((c,i)=>r[i]=~~r[i]+c,r=[,...r]),r=[])&&r

63 바이트 변형 :a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
Arnauld

@Arnauld 나는 역전이 나쁜 움직임이라고 동의한다. 그러나 길이가 너무 길다!
Neil

3

CJam , 22 21 바이트

Martin Ender 덕분에 1 바이트 절약

{_,({0\f+}*ee::m<:.+}

익명 블록은 스택에서 인수를 예상하고 스택에 결과를 남깁니다.

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

작동 원리

_                   e# Duplicate the matrix
 ,(                 e# Get its length (# of rows) minus 1
   {0\f+}*          e# Prepend that many 0s to each row
          ee        e# Enumerate; map each row to [index, row]
            ::m<    e# Rotate each row left a number of spaces equal to its index
                :.+ e# Sum each column

2

05AB1E , 17 바이트

Rvy¹gÅ0«NFÁ}})øO¨

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

설명

R                  # reverse input
 v                 # for each N,y (index, item)
  y¹gÅ0«           # pad y with as many zeroes as the number of rows in the input
        NFÁ}       # rotate each row N times right
            })     # wrap the result in a list
              øO   # sum the columns
                ¨  # remove the last element of the resulting list (the padded zeroes)



1

젤리 , 8 바이트

ŒDS€ṙZL$

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

코드의 절반은 결과를 올바른 순서로 배치하는 데 사용됩니다.

어떻게?

ŒDS€ṙZL$ - Main link: list of lists of numbers
ŒD       - diagonals (starts with the diagonal containing the top left element,
         -            then the next diagonal to the right, and so on wrapping around)
  S€     - sum €each
       $ - last two links as a monad
     Z   - transpose the matrix
      L  - length (width of the matrix)
    ṙ    - rotate the results left by that amount

1

펄 5, 47 바이트

map{$j=--$.;map{@a[$j++]+=$_}split}<>
print"@a"

1

R, 45 바이트

행렬 클래스 객체를 입력으로 사용하는 명명되지 않은 함수 :

function(x)sapply(split(x,col(x)-row(x)),sum)

답변 에서 설명한 아이디어를 사용합니다 .


이 과제의 규칙을 사용하면에 대한 요청을 제거 할 수 있다고 믿지만 이것이 unname관계없이 훌륭한 솔루션입니다!
주세페

1

옥타브, 71 바이트

A가 행렬이라고 가정하면 다음과 같습니다.

A = [17 4 5;24 16 5; 9 24 10; 1 14 22; 1 21 24; 4 4 17;24 25 17];

그럼 우리는 :

[m,n]=size(A);
a=[zeros(m,m-1),A]';
for i=1:m+n-1
trace(a(i:end,:))
end

행렬을 바꾸면 대각선 합의 순서가 반대로되어 for 루프에 전체 2 바이트가 저장됩니다.

산출:

ans =  24
ans =  29
ans =  22
ans =  39
ans =  47
ans =  70
ans =  43
ans =  9
ans =  5

1
[m,n]=size(A);for i=1:m+n-1,trace([zeros(m-1,m);A'](i:end,:)),end6 바이트를 저장합니다. 옥타브는 직접 인덱싱 및 인라인 할당을 수행 할 수 있습니다. 불행하게도, 당신이 사용해야합니다 생각 있도록 코드를 실행하기 전에 작업 공간에서 변수 존재가 허용되지 않는 것으로 가정 input처럼, 는 75 바이트로 백업 가져. 그래도 좋은 접근 방식이므로 +1 :) 그리고 PPCG에 오신 것을 환영합니다! =)
Stewie Griffin

또한 4 바이트를 절약하면서 zeros(m-1,m)쓸 수 있습니다 ~e(m-1,m).
Stewie Griffin

0

파이썬, 126 바이트

x=input()
f=lambda k:[x[i+k][i]for i in range(len(x)-k)]
a=map(f,range(4)[::-1])
x=zip(*x)
print(map(sum,a+map(f,range(1,4))))

f아래쪽 삼각형 부분에서만 작동하므로, 그것을 바꾸어 위쪽 삼각형 부분을 가져옵니다. f함수가 음수 값 에서 작동하지 않는 이유를 모릅니다 (음수 f를 얻는 부분이 작동하지 않기 때문에 더 짧게 변경되었습니다 ).


마지막 테스트 사례에 오류가 발생합니다. tio.run/nexus/…
Dennis

0

C, 148 바이트

온라인 시도

s;g(int i,int j,int**m,int x){for(s=0;x;x--)s+=m[i++][j++];printf(" %d",s);}
k;f(int n,int**m){for(k=n;--k;)g(k,0,m,n-k);for(;k<n;k++)g(0,k,m,n-k);}


0

Awk, 67 바이트

{for(f=0;f++<NF;)s[NF-NR+f]+=$f}END{i=0;while(i++<NR*2)print s[i]}

언 골프 드 :

{
    for (f = 0; f++ < NF;)
        s[NF-NR+f] += $f
}
END {
    i = 0
    while (i++ < NR*2)
        print s[i]
}

공백의 awk 분할 $nnth 필드 (1 인덱스)입니다. NF행의 필드 NR수이고 현재 행의 수입니다. 정의되지 않은 변수는 0이며 처음 사용할 때 생성됩니다.


0

PHP, 86 바이트

두 가지 변형의 메모리 친화적 솔루션 :

<?for($i=$c=count($a=$_GET);--$i>-$c;print$s._)for($s=0,$d=$c;$d--;)$s+=$a[$i+$d][$d];
<?for($i=$c=count($a=$_GET);--$i>-$c;print$s._)for($s=$d=0;$d<$c;)$s+=$a[$i+$d][$d++];

스크립트 매개 변수에서 입력을 받고 밑줄을 구분 기호로 사용합니다.
기본 설정 (기본 php.ini 아님)을 사용하거나 온라인으로 시도하십시오


0

클로저, 81 바이트

#(apply map +(map(fn[i c](concat(repeat(-(count %)i 1)0)c(repeat i 0)))(range)%))

열 단위의 합계를 계산할 수 있도록 목록을 0으로 채우므로 매우 장황합니다.


0

수학 73 바이트

Plus@@@Table[Diagonal[Partition[#1,#2[[1]]],k],{k,-#2[[2]]+1,#2[[1]]-1}]&

이것은 모든 2D 배열 mxn (nxn뿐만 아니라)
이 코드 끝에서 배열을 입력 할 때 작동합니다 (마지막 테스트 사례)

[{17,4,5,24,16,5,9,24,10,1,14,22,1,21,24,4,4,17,24,25,17},{3,7}]

{24, 29, 22, 39, 47, 70, 43, 9, 5}

[{a, b, c, d ...}, {m, n}] 형식의 입력

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