Tập hợp chuỗi con


26

Giới thiệu

Hãy quan sát mảng này : [3, 2, 4, 1, 1, 5, 1, 2].

Mỗi phần tử hiển thị độ dài của chuỗi con phải được tóm tắt. Chúng ta hãy xem phần tử đầu tiên của mảng trên:

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

Phần tử ở chỉ mục đầu tiên là 3 , vì vậy bây giờ chúng ta lấy một chuỗi con có độ dài ba với cùng chỉ mục là vị trí bắt đầu:

[3, 2, 4]

Khi tổng kết, kết quả này thành 9 , vì vậy phần tử đầu tiên của tập hợp chuỗi con9.

Chúng tôi làm điều này cho tất cả các yếu tố trong mảng:

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

Bạn có thể thấy rằng số 5 là một trường hợp kỳ lạ. Con số đó vượt quá độ dài của mảng:

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

Chúng tôi sẽ bỏ qua mọi thứ vượt quá mảng, vì vậy chúng tôi chỉ sử dụng [5, 1, 2].

Bước cuối cùng là tổng hợp mọi thứ:

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

Và đó là mảng cần được xuất ra:

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

Nhiệm vụ

Đưa ra một mảng không trống với các số nguyên dương (khác không), xuất tập hợp tổng chuỗi con . Đây là , vì vậy bài nộp có số byte nhỏ nhất sẽ thắng!

Các trường hợp thử nghiệm

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

Tôi nghĩ bạn có nghĩa là "danh sách phụ", không phải "chuỗi con". Không có chuỗi.
mbomb007

4
@ mbomb007 Tôi nghĩ rằng chuỗi con có ý nghĩa tương tự ở đây như trong bài toán chuỗi con chung dài nhất, nghĩa là một chuỗi con có các phần tử liền kề nhau. Các loại dữ liệu sang một bên, một chuỗi chỉ là một chuỗi các phần tử hữu hạn của một bộ chữ cái (trong trường hợp này là các số nguyên dương).
Dennis

Câu trả lời:



11

Python, 40 byte

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

Kiểm tra nó trên Ideone .


Tôi đoán rằng sẽ có một giải pháp đệ quy golfier, nhưng bạn đánh bại tôi với nó.
El'endia Starman

11

Excel, 21 byte

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

Mở một bảng tính mới, đặt các giá trị thử nghiệm vào cột A. Nhập công thức vào B1 và ​​nhấp đúp vào tay cầm ô để đi theo phạm vi.


Tôi sẽ cung cấp cho bạn một upvote thứ hai để dạy tôi về thủ thuật nhấp đúp đó nếu tôi có thể.
Neil

Mặc dù nó hoạt động nhưng đó là một chút gian lận vì việc thực thi đòi hỏi phải nhập thủ công.
dùng3819867

3
@ user3819867 không nhiều hơn đáng kể so với hầu hết thực hiện chương trình, tôi tranh luận. Có lẽ sẽ còn tương đương hơn nữa nếu bạn lưu một bảng tính chỉ chứa công thức trong B1 - sau đó mở, thêm dữ liệu vào cột A và bấm đúp vào tay cầm trên B1 để thực thi. YMMV tất nhiên.
Joffan

7

Python 3, 47 byte

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

Thực hiện khá đơn giản. Hành vi mặc định của Python đối với các lát cắt đi qua cuối danh sách rất thuận tiện ở đây.


5

Haskell, 34 , 33 byte

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

Một byte được lưu bởi nimi.


4

JavaScript ES6, 50 byte

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

Khá tự giải thích. Nó mapvượt qua từng phần tử trong mảng, lấy slicetừ index đó thông qua chỉ số cộng với egiá trị của lement đó và reduceing bằng cách thêm.

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 byte

+/@{."_1]\.

Sử dụng

   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

Giải trình

+/@{."_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

JavaScript (ES6), 45

reduce lại bị đánh!

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
Theo tôi biết, bạn có thể loại bỏ f=, giống như trong câu trả lời này .
LarsW

@LarsW đúng, số f=này chưa được tính trong 45 byte
edc65

3

Võng mạc , 38 byte

Số lượng byte giả định mã hóa ISO 8859-1.

\d+
$*
M!&`\b1(1)*(?<-1>,1+)*
M%`1
¶
,

Đầu vào và đầu ra là các danh sách được phân tách bằng dấu phẩy.

Hãy thử trực tuyến! (Dòng đầu tiên cho phép bộ kiểm tra được phân tách bằng nguồn cấp.)


3

Toán học 60 55 byte

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

ví dụ

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}}    *)

Cảm ơn @MartinEnder đã loại bỏ 5 byte :)


1
Đây là một ý tưởng để tránh bảng: #+Tr@Take[x=Rest@x,UpTo[#-1]]&/@(x=#)&Vẫn không chắc nó tối ưu nhưng nó tiết kiệm 17 byte.
Martin Ender

3

05AB1E, 11 8 byte

[D¬£Oˆ¦Ž

Giải trình

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

Dùng thử trực tuyến



2

Erlang, 69 byte

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

Các hàm bậc cao hơn của Erlang cho các danh sách không nhận được chỉ mục của phần tử hiện tại. Điều này sử dụng từ điển quy trình để thiết lập chỉ mục của phần tử hiện tại.



2

VBA, 160 byte

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

Bình thường, 6 byte

ms<~tQ

Bộ kiểm tra

Đây là một giải pháp khác với bất kỳ người nào khác cho đến nay. Nó lặp qua đầu vào, cắt một tổng các giá trị ban đầu, sau đó loại bỏ phần tử đầu tiên của đầu vào được lưu trữ và lặp lại.

Giải trình:

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 byte

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

1

JavaScript (ES6) - 79 byte

Một giải pháp đệ quy không sử dụng bất kỳ phương thức Array nào:

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

Kiểm tra:

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 byte

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

khá thẳng về phía trước

cải tiến ý tưởng đánh giá cao


1

Brachylog , 27 byte

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

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

  .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

APL Dyalog, 15 byte

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

hoặc là

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

1

Chương trình PHP, 72 byte

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

gọi với php-cgi -f <filename> 'a[]=3&a[]=2&a[]=4...

+11 là một hàm:

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

+9 không có nội dung:

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

($ c giữ các giá trị ban đầu, $ a đếm ngược cho mỗi chỉ mục, $ r được tính tổng)

-3 là chương trình:

<?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 byte)

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

Thí dụ:

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 byte

Yay, cuối cùng là một thử thách tôi không cần các tính năng mới!

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

Chạy với: python matricks.py substring.txt [[<input>]] 0

Giải trình:

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

Javascript (sử dụng Thư viện ngoài) (66 byte)

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

Liên kết đến lib: https://github.com/mvegh1/Enumerable

Giải thích mã: _Từ việc tải mảng đầu vào vào thư viện, về cơ bản là LINQ cho js. Sau đó, mỗi mục trong mảng được ánh xạ theo vị từ sau: Lấy đầu vào và cắt nó từ chỉ mục mục hiện tại và lấy chỉ mục đó cộng với giá trị của mục hiện tại. Sau đó, Sum lên sau đó. Chuyển đổi kết quả thành một mảng JS gốc và trả về nó

nhập mô tả hình ảnh ở đây


Loại bỏ các var biến, bạn không cần điều đó trong golf. Bạn cũng có thể thay đổi .forEachthành .mapchi phí ít byte hơn.
charredgrass

Ồ vâng, bạn nói đúng về var. Cảm ơn! Tôi sẽ đi qua câu trả lời này một lần nữa vào ngày mai. Có vẻ như JS (es6) bản địa giết chết giải pháp của tôi lol
applejacks01

Cuộc gọi tốt về loại bỏ var. Tôi cũng nhận ra một giải pháp khác giúp giảm số lượng byte rất nhiều và cũng trực quan hơn
applejacks01

1

Clojure, 63 byte

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

Sử dụng khớp mẫu để phân tách đối số đầu vào thành đầu tiên và phần còn lại của đối số.


1

MATL , 17 14 13 byte

fGy+!-R0<G*!s

Giải trình

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm (mã được sửa đổi để xử lý một số đầu vào).

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 byte

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

Trong đó a là một int [] đại diện cho đầu vào cần giải quyết.


bạn không được phép giả sử một biến được xác định trước
downrep_nation

Biến a là đầu vào cần giải.
Supermaneerkat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.