ชุดผลรวมย่อย


26

บทนำ

[3, 2, 4, 1, 1, 5, 1, 2]ลองสังเกตอาร์เรย์นี้:

แต่ละองค์ประกอบจะแสดงความยาวของสตริงย่อยซึ่งจะต้องสรุปรวม ลองดูที่องค์ประกอบแรกของอาร์เรย์ด้านบน:

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

องค์ประกอบที่ดัชนีแรกคือ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]

งาน

ได้รับอาเรย์ไม่ว่างเปล่ากับขั้วบวก (ไม่ใช่ศูนย์) จำนวนเต็มส่งออกชุดย่อยรวม นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!

กรณีทดสอบ

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

ฉันคิดว่าคุณหมายถึง "sub-list" ไม่ใช่ "substring" ไม่มีสตริง
mbomb007

4
@ mbomb007 ฉันคิดว่าสตริงย่อยมีความหมายเหมือนกันที่นี่ในปัญหาสตริงย่อยทั่วไปที่ยาวที่สุดนั่นคือลำดับที่องค์ประกอบที่อยู่ติดกัน ประเภทข้อมูลกันสตริงเป็นเพียงลำดับที่แน่นอนขององค์ประกอบของชุดตัวอักษร (ในกรณีนี้คือจำนวนเต็มบวก)
Dennis

คำตอบ:


15

เยลลี่ 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.

11

Python ขนาด 40 ไบต์

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

ทดสอบบนIdeone


ฉันคิดว่าจะมีวิธีแก้ปัญหาซ้ำนักกอล์ฟ แต่คุณเอาชนะฉันไป
El'endia Starman

11

Excel, 21 ไบต์

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

เปิดสเปรดชีตใหม่ใส่ค่าทดสอบในคอลัมน์ A ป้อนสูตรใน B1 และดับเบิลคลิกที่จุดจับเซลล์เพื่อขี่ช่วง


ฉันจะให้ upvote ที่สองสำหรับการสอนฉันเกี่ยวกับเคล็ดลับการคลิกสองครั้งนั้นถ้าทำได้
Neil

ในขณะที่ทำงานมันเป็นการโกงเล็กน้อยเนื่องจากการประมวลผลจำเป็นต้องป้อนข้อมูลด้วยตนเอง
user3819867

3
@ user3819867 ไม่มากไปกว่าการเรียกใช้โปรแกรมส่วนใหญ่ฉันเถียง บางทีมันอาจจะเปรียบเทียบได้มากกว่านี้หากคุณบันทึกสเปรดชีตที่มีสูตรใน B1 เท่านั้น - จากนั้นเปิดเพิ่มข้อมูลลงในคอลัมน์ A และดับเบิลคลิกที่จุดจับบน B1 เพื่อดำเนินการ แน่นอน YMMV
Joffan

7

Python 3, 47 ไบต์

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

การดำเนินการตรงไปตรงมาสวย พฤติกรรมเริ่มต้นของ Python สำหรับชิ้นที่ผ่านไปตอนท้ายของรายการมีความสะดวกมากที่นี่



4

JavaScript ES6, 50 ไบต์

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

สวยอธิบายตนเอง มันmapอยู่เหนือแต่ละองค์ประกอบในอาเรย์รับsliceจากindex นั้นผ่านดัชนีบวกeค่าของ lement และreduceing โดยการเพิ่ม

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

JavaScript (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

เรติน่า , 38 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส ISO 8859-1

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

อินพุตและเอาต์พุตเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาค

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีด)


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

ขอบคุณ @MartinEnder สำหรับการลบ 5 ไบต์ :)


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

Erlang, 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

JavaScript (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

โปรแกรม 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 ไบต์

Yay ในที่สุดความท้าทายฉันไม่ต้องการคุณสมบัติใหม่สำหรับ!

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

Javascript (ใช้ห้องสมุดภายนอก) (66 ไบต์)

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

ลิงก์ไปยัง lib: https://github.com/mvegh1/Enumerable

คำอธิบายรหัส: _.From กำลังโหลดอาร์เรย์อินพุตลงในไลบรารีซึ่งโดยทั่วไปคือ LINQ สำหรับ js จากนั้นแต่ละรายการในอาเรย์จะถูกแมปตามคำกริยาต่อไปนี้: นำเข้าและแบ่งจากดัชนีรายการปัจจุบันและนำดัชนีนั้นบวกค่าของรายการปัจจุบัน จากนั้นสรุปลำดับที่ แปลงผลลัพธ์เป็นอาร์เรย์ JS ดั้งเดิมและส่งคืน

ป้อนคำอธิบายรูปภาพที่นี่


ลบออกvar จากตัวแปรคุณไม่จำเป็นต้องใช้ในการเล่นกอล์ฟ นอกจากนี้คุณยังสามารถเปลี่ยน.forEachเป็น.mapค่าใช้จ่ายที่น้อยกว่าไบต์
charredgrass

โอ้ใช่แล้วคุณพูดถูก ขอบคุณ! ฉันจะตอบคำถามนี้อีกครั้งในวันพรุ่งนี้ ดูเหมือนว่าพื้นเมือง (es6) JS จะฆ่าทางออกของฉัน lol
applejacks01

โทรดีเมื่อลบ var ฉันยังได้ตระหนักถึงวิธีการแก้ปัญหาอื่นซึ่งจะช่วยลดจำนวนไบต์ได้มากขึ้นและใช้งานง่ายยิ่งขึ้น
applejacks01

1

Clojure, 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.