부분 문자열 합 세트 요소에 대해이 작업을 수행합니다. 3 -> [3, 2,

소개

이 배열을 살펴 봅시다 : [3, 2, 4, 1, 1, 5, 1, 2].

각 요소는 합쳐야하는 부분 문자열의 길이를 표시합니다. 위 배열의 첫 번째 요소를 살펴 보겠습니다.

[3, 2, 4, 1, 1, 5, 1, 2]
 ^

첫 번째 인덱스의 요소는 3 이므로 시작 위치와 동일한 인덱스를 가진 길이가 3 인 하위 문자열을 가져옵니다.

[3, 2, 4]

합산하면 결과는 9 이므로 부분 문자열 합 집합 의 첫 번째 요소 는 9입니다.

배열의 모든 요소에 대해이 작업을 수행합니다.

3 -> [3, 2, 4]
2 -> [2, 4]
4 -> [4, 1, 1, 5]
1 -> [1]
1 -> [1]
5 -> [5, 1, 2]
1 -> [1]
2 -> [2]

숫자 5 가 약간 이상한 경우 임을 알 수 있습니다 . 해당 숫자가 배열의 길이를 초과합니다.

[3, 2, 4, 1, 1, 5, 1, 2]
                ^  ^  ^  ^  ^

배열을 초과하는 모든 것을 무시하므로 그냥 사용하십시오 [5, 1, 2].

마지막 단계는 모든 것을 요약하는 것입니다.

[3, 2, 4]     -> 9
[2, 4]        -> 6
[4, 1, 1, 5]  -> 11
[1]           -> 1
[1]           -> 1
[5, 1, 2]     -> 8
[1]           -> 1
[2]           -> 2

그리고 그것은 출력되어야 할 배열입니다 :

[9, 6, 11, 1, 1, 8, 1, 2]

작업

양의 (0이 아닌) 정수를 가진 비어 있지 않은 배열이 주어지면 부분 문자열 합 set을 출력하십시오 . 이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!

테스트 사례

[1, 2, 3, 4, 5] -> [1, 5, 12, 9, 5]
[3, 3, 3, 3, 3, 3, 3, 3] -> [9, 9, 9, 9, 9, 9, 6, 3]
[5, 1, 2, 4, 1] -> [13, 1, 6, 5, 1]
[1] -> [1]



답변

젤리 , 6 바이트

ṫJḣ"ḅ1

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

작동 원리

ṫJḣ"ḅ1  Main link. Argument: A (array)

 J      Index; yield the 1-based indices of A.
ṫ       Tail; map k to the postfix of A that begins with the k-th element.
  ḣ"    Vectorized head; for each k in A, truncate the corr. postfix to length k.
    ḅ1  Convert the resulting slices from base 1 to integer.


답변

파이썬, 40 바이트

f=lambda x:x and[sum(x[:x[0]])]+f(x[1:])

Ideone에서 테스트하십시오 .


답변

엑셀, 21 바이트

=SUM(OFFSET(A1,,,A1))

새 스프레드 시트를 열고 A 열에 테스트 값을 입력하십시오. B1에 수식을 입력하고 셀 핸들을 두 번 클릭하여 범위를 타십시오.


답변

파이썬 3, 47 바이트

lambda X:[sum(X[i:i+k])for i,k in enumerate(X)]

매우 간단한 구현입니다. 리스트의 끝을 지나는 슬라이스에 대한 파이썬의 기본 동작은 여기서 매우 편리했습니다.


답변

하스켈, 34 , 33 바이트

f l@(x:y)=sum(take x l):f y
f x=x

nimi가 1 바이트를 절약했습니다.


답변

자바 스크립트 ES6, 50 바이트

a=>a.map((e,i)=>a.slice(i,i+e).reduce((a,b)=>a+b))

꽤 자명하다. 그것은 map지고, 어레이의 각 요소를 통해 s의 slice것과 i인덱스 더한 것을 통해 ndex을 element 값과 reduce가산함으로써 보내고.

f=
  a=>a.map((e,i)=>a.slice(i,i+e).reduce((a,b)=>a+b))

;[
  [3, 2, 4, 1, 1, 5, 1, 2],
  [1, 2, 3, 4, 5],
  [3, 3, 3, 3, 3, 3, 3, 3,],
  [5, 1, 2, 4, 1],
  [1]
].forEach(function(test){
  document.getElementById('p').textContent += test + ' => ' + f(test) + '\n';
});
<pre id="p"></pre>


답변

J, 11 바이트

+/@{."_1]\.

용법

   f =: +/@{."_1]\.
   f 3 2 4 1 1 5 1 2
9 6 11 1 1 8 1 2
   f 1 2 3 4 5
1 5 12 9 5

설명

+/@{."_1]\.  Input: A
        ]\.  Get each suffix of A from longest to shortest
   {."_1     For each value in A, take that many values from its corresponding suffix
+/@          Sum that group of values taken from that suffix
             Return the sums