부분 문자열 합 세트


26

소개

이 배열을 살펴 봅시다 : [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]

"substring"이 아니라 "sub-list"를 의미한다고 생각합니다. 문자열이 없습니다.
mbomb007

4
@ mbomb007 하위 문자열은 여기에서 가장 긴 공통 하위 문자열 문제와 동일한 의미, 즉 요소가 인접한 하위 시퀀스와 동일하다고 생각합니다. 데이터 유형을 제외하고 문자열은 알파벳 집합의 유한 요소 시퀀스입니다 (이 경우 양의 정수).
Dennis

답변:



11

파이썬, 40 바이트

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

Ideone에서 테스트하십시오 .


나는 골퍼 재귀 솔루션이있을 것이라고 생각 했지만 당신은 나를 이겼습니다.
El'endia Starman

11

엑셀, 21 바이트

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

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


할 수 있다면 더블 클릭 트릭에 대해 가르쳐 줄 두 번째 공감대를 드리겠습니다.
Neil

작동하는 동안 수동 입력이 필요하기 때문에 약간의 속임수입니다.
user3819867

3
@ user3819867은 대부분의 프로그램 실행보다 크게 중요하지 않다고 주장했다. B1에 수식 만 포함 된 스프레드 시트를 저장 한 다음 열을 열고 데이터를 열 A에 추가 한 다음 B1의 핸들을 두 번 클릭하여 실행하면 훨씬 더 비슷할 것입니다. 물론 YMMV.
Joffan

7

파이썬 3, 47 바이트

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

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


5

하스켈, 34 , 33 바이트

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

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


4

자바 스크립트 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>


4

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

4

자바 스크립트 (ES6), 45

reduce 다시 맞았다!

a=>a.map((v,i)=>eval(a.slice(i,v+i).join`+`))

F=
a=>a.map((v,i)=>eval(a.slice(i,v+i).join`+`))

;[[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(t=>console.log(t+' -> '+F(t)))


1
내가 아는 한이 답변f= 에서처럼을 제거 할 수 있습니다 .
LarsW

@LarsW 맞아, f=이미 45 바이트로 계산되지 않습니다
edc65


3

Mathematica 60 55 바이트

Tr@Take[#,UpTo@#&@@#]&/@Drop[#,t-1]~Table~{t,Length@#}&

예 :

f = %; f /@ {{1, 2, 3, 4, 5}, {3, 3, 3, 3, 3, 3, 3, 3}, {5, 1, 2, 4, 1}, {1}}

(*    {{1, 5, 12, 9, 5}, {9, 9, 9, 9, 9, 9, 6, 3}, {13, 1, 6, 5, 1}, {1}}    *)

5 바이트를 면도 해 주셔서 감사합니다 @MartinEnder :)


1
테이블을 피하는 아이디어는 다음과 같습니다. #+Tr@Take[x=Rest@x,UpTo[#-1]]&/@(x=#)&여전히 최적인지 확실하지 않지만 17 바이트를 절약합니다.
Martin Ender

3

05AB1E, 11 8 바이트

[D¬£Oˆ¦Ž

설명

[         # infinite loop
 D        # duplicate current list
  ¬       # get head of list
   £      # get that many elements from list
    O     # sum
     ˆ    # add to global array
      ¦   # remove first element of list
       Ž  # break if stack is empty
          # implicitly push and print global array

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



2

얼랭, 69 바이트

f(A)->put(1,1),L=lists,[L:sum(L:sublist(A,put(1,get(1)+1),X))||X<-A].

리스트에 대한 Erlang의 고차 함수는 현재 요소의 색인을받지 않습니다. 프로세스 사전을 사용하여 현재 요소의 색인을 설정합니다.



2

VBA, 160 바이트

Function e(g())
Dim h()
k=LBound(g)
l=UBound(g)
ReDim h(k To l)
On Error Resume Next
For i=k To l
For j=i To i+g(i)-1
h(i)=h(i)+g(j)
Next
Next
e=h
End Function

2

Pyth, 6 바이트

ms<~tQ

테스트 스위트

이것은 지금까지 다른 솔루션과 다른 솔루션입니다. 입력을 반복하여 초기 값을 합한 다음 저장된 입력의 첫 번째 요소를 제거하고 반복합니다.

설명:

ms<~tQ
ms<~tQdQ    Implicit variable introduction
            Implicit: Q = eval(input())
m      Q    Map d over the input, Q
  <  Qd     Take the first d elements of Q
 s          Sum them
   ~tQ      Afterwards, set Q to the tail of Q, removing the first element.


1

F #, 84 82 바이트

let f(A:int[])=[for i in 0..A.Length-1->Seq.skip i A|>Seq.truncate A.[i]|>Seq.sum]

1

자바 스크립트 (ES6)-79 바이트

Array 메소드를 사용하지 않는 재귀 솔루션 :

f=([a,...t],n)=>a&&n?a+f(t,n-1):0;g=([a,...t],r=[])=>a?g(t,[...r,a+f(t,a-1)]):r

테스트 :

f=([a,...t],n)=>a&&n?a+f(t,n-1):0;
g=([a,...t],r=[])=>a?g(t,[...r,a+f(t,a-1)]):r;

[
  [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(a=>console.log(''+g(a)));


1

C #, 89 바이트

int[]s(List<int>a)=>a.Select((n,i)=>a.GetRange(i,Math.Min(n,a.Count-i)).Sum()).ToArray();

꽤 직설적 인

개선 아이디어 감사


1

Brachylog , 27 바이트

.v|h~l(A:Tc?;A?)b:0&~b.h~+A

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

설명

  .v           Input = Output = []
|            Or
  h~l          A is a list, its length is the value of the first element of the Input
  (
    A:Tc?        The concatenation of A with another list T results in the Input
  ;            Or
    A?           A = Input
  )
  b:0&         Call recursively on Input minus the first element
  ~b.          Output is the output of that call with an extra element at the beginning
  h~+A         That extra element is the sum of the elements of A

1

Dyalog APL, 15 바이트

{+/¨⍵↑∘⌽¨⌽,\⌽⍵}

또는

{⌽+/¨(-↑¨,\)⌽⍵}

1

PHP 프로그램, 72 바이트

<?foreach($a=$_GET[a]as$i=>$v)echo array_sum(array_slice($a,$i,$v)),"
";

와 전화 php-cgi -f <filename> 'a[]=3&a[]=2&a[]=4...

함수로서 +11 :

function f($a){foreach($a as$i=>$v)$r[]=array_sum(array_slice($a,$i,$v));return$r;}

내장없이 +9 :

function p($a){foreach($c=$r=$a as$i=>$v)for($k=$i;$k--;)if(--$a[$k]>0)$r[$k]+=$v;return$r;}

($ c는 원래 값을 유지하고 $ a는 각 인덱스에 대해 카운트 다운하고 $ r은 합계를 얻습니다)

프로그램으로 -3 :

<?foreach($a=$r=$c=$_GET[a]as$i=>$v)for($k=$i;$k--;)if(--$c[$k]>0)$r[$k]+=$v;print_r($r);

1

q (37 바이트)

{sum each(til[count x],'x)sublist\:x}

예:

q){sum each(til[count x],'x)sublist\:x}3 2 4 1 1 5 1 2
9 6 11 1 1 8 1 2

1

Matricks , 25 바이트

예, 마침내 새로운 기능이 필요없는 도전입니다!

md{z:l-g:c;+c;q:c;};:1:l;

로 실행 : python matricks.py substring.txt [[<input>]] 0

설명:

m                  :1:l;   #loop over entire input
                           #set each value to...
 d{               }        #the sum of...
   z:l-g:c:+c;q:c;         #the input cropped to
                           #the length of the value in the cell

1

자바 스크립트 (외부 라이브러리 사용) (66 바이트)

n=>_.From(n).Select((v,i)=>_.From(n).Slice(i,i+v).Sum()).ToArray()

lib에 링크 : https://github.com/mvegh1/Enumerable

코드 설명 : _.From은 입력 배열을 라이브러리에로드합니다. 기본적으로 js의 경우 LINQ입니다. 그런 다음 배열의 각 항목은 다음 술어에 따라 맵핑됩니다. 입력을 가져 와서 현재 항목 색인에서 분할하고 해당 색인에 현재 항목 값을 더하십시오. 그런 다음 하위 시퀀스를 요약하십시오. 결과를 기본 JS 배열로 변환하여 반환

여기에 이미지 설명을 입력하십시오


var 변수에서를 제거하면 골프에서는 필요하지 않습니다. 당신은 또한 변경할 수 있습니다 .forEach.map있는 적은 바이트를 요한다.
charredgrass

네, var에 대해 옳습니다. 감사! 내일 다시이 대답을하겠습니다. 그것은 기본 JS처럼 보인다 (ES6)는 롤 내 솔루션을 죽이고
applejacks01

var를 제거하는 것이 좋습니다. 나는 또한 바이트가 많이 계산 줄이고도 더 직관적 인 다른 솔루션을 실현
applejacks01

1

클로저, 63 바이트

(defn f[[b & r]](concat[(apply + b(take(dec b)r))](if r(f r))))

패턴 일치를 사용하여 입력 인수를 첫 번째 인수와 나머지 인수로 분해합니다.


1

MATL , 17 14 13 바이트

fGy+!-R0<G*!s

설명

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 (여러 입력을 처리하도록 코드가 수정 됨).

f     % Take input implicitly. Indices of nonzero elements: this gives [1 2 ... n]
      % where n is input size
G     % Push input again
y     % Push a copy of [1 2 ... n]
+     % Add. Gives [a+1 b+2...] where [a b...] is the input
!     % Transpose into a column vector
-     % Subtraction with broadcast. Gives 2D array
R     % Keep upper triangular part, making the rest of entries 0
0<    % True for negative entries. Each row corresponds to a substring sum.
      % For each row, this gives true for the entries of the input that make up
      % that substring sum. Each row is thus a mask to select entries of the input
G     % Push input again
*     % Multiply with broadcast. This multiplies the input times each row
!s    % Sum of each row. Implicitly display

0

C #, 94 바이트

Console.Write(String.Join(",",a.Select((v,i)=>a.Skip(i).Take(v).Sum().ToString()).ToArray()));

여기서 a는 해결 될 입력을 나타내는 int []입니다.


변수가 미리 정의되어 있다고 가정 할 수 없습니다
downrep_nation

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