ซ้ำผลรวมบางส่วน


23

ผลรวมบางส่วนของรายการจำนวนเต็ม [a 1 , a 2 , a 3 , ... , a, n ] คือ

s 1 = a 1
s 2 = a 1 + a 2
s 3 = a 1 + a 2 + a 3
...
s n = a 1 + a 2 + ... + a n

จากนั้นเราสามารถนำรายการผลรวมบางส่วน [s 1 , s 2 , s 3 , ... , s n ] และคำนวณผลรวมบางส่วนอีกครั้งเพื่อสร้างรายการใหม่และอื่น ๆ

ที่เกี่ยวข้อง: ทำซ้ำความแตกต่างไปข้างหน้า

การป้อนข้อมูล:

  • รายการจำนวนเต็มที่ไม่ว่างเปล่า
  • จำนวนบวกของการวนซ้ำ

เอาท์พุท:พิมพ์หรือส่งคืนรายการจำนวนเต็มที่เป็นผลมาจากการรับผลรวมบางส่วนที่หลายครั้ง

ไบต์ที่น้อยที่สุดจะเป็นผู้ชนะ บิวด์อินนั้นก็โอเคแม้ว่าพวกเขาจะแก้ปัญหาได้ทันที

กรณีทดสอบ:

f([-3, 4, 7, -1, 15], 1) == [-3, 1, 8, 7, 22]
f([-3, 4, 7, -1, 15], 3) == [-3, -5, 1, 14, 49]

ลีดเดอร์บอร์ด:


ข้อโต้แย้งจำเป็นต้องอยู่ในลำดับเดียวกันหรือจำนวนการวนซ้ำมาก่อนรายการตัวเลขหรือไม่
kirbyfan64sos

@ kirbyfan64sos ทั้งคำสั่ง
xnor

คำตอบ:


14

J, 5 ไบต์

+/\^:

ลองมันออนไลน์บนJ.js

มันทำงานอย่างไร

  • /\ เป็นคำวิเศษณ์ (ฟังก์ชั่นที่ใช้อาร์กิวเมนต์ซ้าย) ที่ลดลงอย่างมากด้วยการโต้แย้ง

  • ดังนั้นจึง+/\เป็นคำกริยาสะสม

  • ^:คือการรวมพลัง ; (f ^: n) yใช้fรวมครั้งเพื่อny

  • รถไฟคำกริยาร่วม+/\^:สร้างคำวิเศษณ์ที่ซ้ำ+/\หลาย ๆ ครั้งตามที่ระบุไว้ในอาร์กิวเมนต์ (ซ้าย)

    x (+/\^:) yได้รับการแยกวิเคราะห์เป็นซึ่งเทียบเท่ากับการดำเนินการ(x (+/\^:)) y(+/\^:x) y

ขอบคุณ @Zgarb สำหรับความช่วยเหลือในการอธิบาย


13

Mathematica, 19 ไบต์

ถ้าสร้าง -ins ไม่เป็นไร ...

Accumulate~Nest~##&

กำหนดฟังก์ชั่นที่มีลายเซ็นเดียวกันกับตัวอย่างในการท้าทาย ฉันค่อนข้างแน่ใจว่าต้องขอบคุณชื่อยาว ๆAccumulateที่ภาษานี้ตีด้วยภาษากอล์ฟและตระกูล APL ได้อย่างง่ายดาย :)

หากต้องการอธิบายอย่างละเอียดเกี่ยวกับความคิดเห็นของ LegionMammal978 สำหรับผู้ที่ไม่ได้ใช้ Mathematica:

##แสดงถึงลำดับของพารามิเตอร์ของฟังก์ชั่น (ซึ่งเป็นเหมือนรายการที่ "splats" โดยอัตโนมัติทุกที่ที่มันถูกแทรกหากคุณคุ้นเคยกับคำนั้นจากภาษาที่คุณเลือก) ~เป็นน้ำตาลประโยคสำหรับการภาวนาฟังก์ชั่นมัดดังนั้นหากเราเรียกใช้ฟังก์ชันที่มีพารามิเตอร์listและnและขยายทุกสิ่งที่เราได้รับ:

Accumulate~Nest~##
Nest[Accumulate, ##]
Nest[Accumulate, list, n]

ซึ่งเกิดขึ้นจะเป็นไปตามลำดับการโต้แย้งที่คาดหวังNestไว้


น่าสนใจใช้สัญกรณ์มัดสำหรับ 3 ข้อโต้แย้งโดยใช้SlotSequence...
LegionMammal978

9

Haskell, 26 23 ไบต์

(!!).iterate(scanl1(+))

ฟังก์ชันนี้กำหนดฟังก์ชันที่ไม่ระบุชื่อซึ่งเรียกใช้ดังนี้:

> let f = (!!).iterate(scanl1(+)) in f [-3,4,7,-1,15] 3
[-3,-5,1,14,49]

ขอบคุณ @nimi สำหรับการบันทึก 3 ไบต์

คำอธิบาย

(!!).                    -- Index by second argument from
     iterate(         )  -- the infinite list obtained by iterating
             scanl1(+)   -- the partial sums function (left scan by +) to first argument

ดีมาก! และขอบคุณสำหรับคำอธิบาย!
Jake

2
ไป pointfree (!!).iterate(scanl1(+))แล้วคุณยังสามารถละเว้นชื่อสำหรับฟังก์ชั่น:
nimi

@nimi ขอบคุณ! อย่างใดฉันเหตุผลองค์ประกอบที่จะไม่ทำงานเพื่อประโยชน์ของฉันที่นี่ ...
Zgarb

9

APL, 9 8 ไบต์

{+\⍣⍺⊢⍵}

ฟังก์ชันนี้กำหนดฟังก์ชัน dyadic ที่ยอมรับการวนซ้ำและแสดงรายการเป็นอาร์กิวเมนต์ซ้ายและขวา

ขอบคุณ @NBZ สำหรับการเล่นกอล์ฟ 1 ไบต์!

ลองมันออนไลน์บนTryAPL

มันทำงานอย่างไร

  • และเป็นอาร์กิวเมนต์ด้านซ้ายและขวาของฟังก์ชัน

  • +\ เป็นการลดยอดสะสมโดยรวม

  • ⍣⍺ทำซ้ำเวลาตัวดำเนินการก่อนหน้า

  • ⊢⍵ใช้ฟังก์ชั่นตัวตนเพื่อ

    นี้เป็นวิธีที่สั้นแยกรหัสเป็นแทน(+\⍣⍺)⍵+\⍣(⍺⍵)

ร่วมกันเราใช้+\เวลาทั้งหมดกับ


@AlexA .: ถ้าอย่างนั้นจะไม่ได้+\⍣⎕⊢⎕รับการยอมรับ? ( เหมือน Python input())
marinus

1
@marinus จริง ๆ แล้วพิมพ์นอก REPL หรือไม่? เดสก์ท็อปล่ามเดียวที่ฉันต้องกำหนดให้ใช้หลังจากนั้น
Dennis

5

Matlab, 41 ไบต์

function f(l,n);for i=1:n;l=cumsum(l);end

ค่อนข้างตรงไปตรงมา ฉันยังคงคิดว่ามันค่อนข้างน่ารำคาญที่ไม่ได้มีวิธีการสร้างฟังก์ชั่นที่ไม่ระบุชื่อที่กำหนดเป็นชิ้น ๆ หรือจุดยึดในการเรียกซ้ำ

Ungolfed:

function f(l,n);
for i=1:n;
    l=cumsum(l);
end

5

JavaScript (ES6) 38

ขนาดเล็กที่น่าแปลกใจโดยใช้. map ซ้ำ

f=(l,n,t=0)=>n?f(l.map(x=>t+=x),n-1):l

function test()
{
  var n, v, i = I.value
  v = i.match(/\-?\d+/g).map(x=>+x)
  n = v.pop()
  console.log(v,n)
  O.innerHTML = I.value + ' -> ' + f(v,n) + '\n' + O.innerHTML;
}

test()
<input id=I value='[-3, 4, 7, -1, 15], 3'><button onclick="test()">-></button>
<pre id=O></pre>


5

K, 7 3 ไบต์

{y+\/x}

คล้ายกับโซลูชัน J มาก +\ดำเนินการผลรวมบางส่วนอย่างแม่นยำและเมื่อ/มีการจัดให้มีกริยาแบบ monadic และอาร์กิวเมนต์จำนวนเต็มซ้ายมันจะวนซ้ำตามจำนวนครั้งที่ระบุเช่นการวนรอบ "for" ส่วนที่เหลือเป็นเพียงห่อมันอย่างเรียบร้อยเพื่อให้เหมาะกับคำสั่งของข้อโต้แย้ง

  {y+\/x}[-3 4 7 -1 15;1]
-3 1 8 7 22
  {y+\/x}[-3 4 7 -1 15;3]
-3 -5 1 14 49

ผ่านการทดสอบใน Kona และตกลง

แก้ไข:

หากฉันได้รับอนุญาตให้ย้อนกลับข้อโต้แย้งตามที่ @ kirbyfan64sos ได้กำหนดไว้ฉันสามารถแจกจ่ายด้วยการห่อฟังก์ชันทั้งหมด:

+\/

เรียกเช่น:

+\/[3;-3 4 7 -1 15]

ทำงานได้อย่างถูกต้องทั้งใน k2.8 และ k5 ใช้งานไม่ได้ใน oK เนื่องจากล่ามยังไม่สนับสนุนคำวิเศษณ์ curated (aka "ที่คาดการณ์") และดูเหมือนจะไม่ทำงานอย่างถูกต้องใน Kona ด้วยเหตุผลที่ชัดเจนน้อยกว่า

แก้ไข : เมื่อไม่กี่วันที่ผ่านมา+\/สูตรยังทำงานใน oK


1
ข้อโต้แย้งสามารถย้อนกลับได้ดังนั้นฉันคิดว่าคุณอาจจะสามารถโกนได้ไม่กี่ไบต์
kirbyfan64sos

3 +\/ -3 4 7 -1 15ทำงานได้ดีใน Kona แต่คุณไม่สามารถกำหนดให้ฟังก์ชันได้ แปลก ...
เดนนิส

ใช่โคน่าเห็นได้ชัดว่าไม่ได้ปฏิบัติ3+\/-3 4 7 -1 15เหมือน+\/[3;-3 4 7 -1 15]- ทำให้ฉันสงสัยว่าพวกเขาจัดการกับอดีตเป็นกรณีประโยคพิเศษ
JohnE


4

Julia, 29 ไบต์

f(x,y)=y>0?f(cumsum(x),y-1):x

สิ่งนี้ไม่ต้องการคำอธิบายมากนัก มันเป็นฟังก์ชันแบบเรียกซ้ำถ้าเช่นy==0นั้นก็แค่เอาท์พุท x มิฉะนั้นการลดลง y ดำเนินการ cumsum และเรียกเก็บเงิน อาจไม่ใช่วิธีแก้ปัญหา Julia ที่เป็นไปได้มากที่สุดที่เป็นไปได้ฉันยังคงพยายามแก้ไข


4

เขาวงกต 73 ไบต์

;?
,"
;
#
#;}=
;  #
"#;(
_  ;={()"
#;; ( { "
  ; { !\(@
+=( =
" " "
":{:"

เป็นเวลานานแล้วที่ข้าตอบบางสิ่งใน Labyrinth และดูเหมือนว่าเป็นไปได้ :)

รูปแบบการป้อนข้อมูลเป็นรายการแบบแฟลตที่มีจำนวนการวนซ้ำก่อน (จากนั้นรายการเพื่อนำผลรวมบางส่วนไปใช้) ตัวคั่นไม่สำคัญเลยตราบใดที่ไม่มีอักขระหลังจากจำนวนเต็มสุดท้ายดังนั้นคุณสามารถใช้สิ่งที่อ่านได้เช่น:

3 | -3, 4, 7, -1, 15

เอาต์พุตถูกคั่นด้วยบรรทัดใหม่:

-3
-5
1
14
49

4

R, 75 ไบต์

มันยาว แต่สิ่งที่ต่างออกไป ... การคำนวณลำดับที่ต้องการโดยตรงแทนที่จะเป็นผลรวมสะสม:

function(x,n)sapply(1:length(x),function(i)sum(x[1:i]*choose(i:1+n-2,n-1)))

สังเกตว่าสัมประสิทธิ์ของเงื่อนไขของ xi สำหรับ cumsum ^ n (x) เป็นเส้นทแยงมุมของสามเหลี่ยมปาสคาล กล่าวคือ

cumsum^3(x) = choose(2,2) * x1, choose(3,2) * x1 + choose(2,2) *x2, choose(4,2) * x1 + choose(3,2) * x2 + choose(2,2) * x3, ....

แก้ไข: เพื่อสร้างฟังก์ชั่น


4

Python 2, 67

นี้ใช้บวกเช่นเดียวกับแอนโธนี Roitmanและเรียกซ้ำเช่นเดียวกับมอร์แกน Thrapp

f=lambda l,n:f([sum(l[:i+1])for i in range(len(l))],n-1)if n else l

ฉันพัฒนาวิธีแก้ปัญหานี้ก่อนที่จะเห็นพวกเขาและจากนั้นมันง่ายกว่าที่จะโพสต์มันเป็นคำตอบแทนที่จะแสดงความคิดเห็นอย่างใดอย่างหนึ่งหรือทั้งสองอย่าง


4

Python, 113 93 89 76 ไบต์

def f(l,n):
 for i in[0]*n:l=[sum(l[:j+1])for j in range(len(l))];
 print(l)

มันใช้งานได้กับทั้งสองกรณีทดสอบ ขอขอบคุณ Status, Morgan Thrapp และ Ruth Franklin ที่ช่วยฉันเล่นกอล์ฟโปรแกรมลงไปที่ 93, 89 และ 76 bytes ตามลำดับ


1
คุณสามารถตัดจำนวนไบต์ด้วยการเปลี่ยนลูปที่สองให้เป็นรายการความเข้าใจ นั่นคือk=[sum(l[:j+1])for j in range(len(l))]. จากนั้นด้วยการ;k=lต่อท้ายที่คุณสามารถกดทั้งหมดนี้ลงในหนึ่งบรรทัดด้วยการfor iวนซ้ำ
สถานะ

1
คุณสามารถย้ายk=[sum(l[:j+1])for j in range(len(l))];l=kไปยังบรรทัดเดียวกับ for loop เพื่อบันทึก 2 ไบต์และลบช่องว่างระหว่างอาร์กิวเมนต์ของ f เพื่อบันทึกไบต์อื่น
Morgan Thrapp

ในขณะที่คุณไม่ได้ใช้ค่าของiคุณสามารถแทนที่for i in range(n)ด้วยfor i in[0]*n(เพราะสิ่งที่คุณใส่ใจคือความยาวไม่ใช่องค์ประกอบของรายการ) และฉันคิดว่าคุณสามารถทำมันได้โดยไม่ต้องใช้รายการเสริมเพียงแค่การปรับเปลี่ยนการโต้แย้งk l
Ruth Franklin

4

Gol> <> 0.3.10 , 22 ไบต์

SI
C>rFlMF:}+
NRl<C}<;

จำนวนเต็มแรกจะถูกนำมาเป็นหมายเลขซ้ำและส่วนที่เหลือทำขึ้นรายการ รายการสุดท้ายมีการแสดงบรรทัดใหม่ที่คั่นด้วย

ภาษายังค่อนข้างอ่อนและไม่เสถียร แต่เนื่องจากฉันค่อนข้างน่าสนใจในโอเปอเรเตอร์เหล่านี้ฉันจึงคิดว่ามันโอเค

คำอธิบาย

SI            Read integer, moving down on EOF (first line runs as loop)
r             Reverse stack, putting iteration number on top

[outer loop]
F             Do #(iterations) times

[inner loop]
lMF           Do #(length of stack - 1) times
:             Duplicate top of stack
}             Rotate stack rightward (top goes to bottom)
+             Add the top two elements of the stack
C             Continue inner loop, moving down from F when loop is over

}             Rotate once more
C             Continue outer loop, moving down from F when loop is over

lRN           Print stack as (num + newline)
;             Halt

หากต้องการดูว่าทำไมจึงใช้งานได้ลองตัวอย่างเล็ก ๆ[5 2 1]:

[5 2 1] -- : --> [5 2 1 1] -- } -->  [1 5 2 1]  -- + --> [1 5 3]
[1 5 3] -- : --> [1 5 3 3] -- } -->  [3 1 5 3]  -- + --> [3 1 8]

-- } --> [8 3 1]

3

Python ขนาด 52 ไบต์

f=lambda l,n:n*l and f(f(l[:-1],1)+[sum(l)],n-1)or l

ฟังก์ชั่นที่ recursive recurses ทั้งในรายการและจำนวนซ้ำl nมาทำลายมันกันเถอะ

อันดับแรกลองพิจารณาฟังก์ชั่นgวนซ้ำที่วนซ้ำผลรวมเพียงครั้งเดียว

g=lambda l:l and g(l[:-1])+[sum(l)]

สำหรับรายการที่ว่างเปล่าlสิ่งนี้จะส่งคืนlตัวเองเป็นรายการที่ว่างเปล่า มิฉะนั้นรายการสุดท้ายของผลรวมบางส่วนของการlเป็นผลรวมโดยรวมของlซึ่งถูกผนวกเข้ากับผล recursive สำหรับทุกคน lแต่องค์ประกอบสุดท้ายของ

ทีนี้ลองดูฟังก์ชั่นfที่ใช้กับgการnวนซ้ำ

f=lambda l,n:n and f(g(l),n-1)or l

เมื่อnใด0นี่จะส่งคืนรายการที่lไม่เปลี่ยนแปลงและนำไปใช้gหนึ่งครั้งแล้วโทรfซ้ำด้วยการทำซ้ำที่เหลืออีกหนึ่งครั้ง

ทีนี้ลองดูรหัสจริงอีกครั้งซึ่งรวมการเรียกซ้ำสองครั้งเป็นฟังก์ชันเดียว ความคิดคือการรักษาเป็นกรณีพิเศษg(l)f(l,1)

f=lambda l,n:n*l and f(f(l[:-1],1)+[sum(l)],n-1)or l

เราเอาf(g(l),n-1)จากนิยามที่ผ่านมาขยายตัวg(l)เข้าไปg(l[:-1])+[sum(l)]แล้วแทนที่g(_)ด้วยการถูกคุมขังโทรเรียกซ้ำไปf(_,1)f

สำหรับกรณีฐานที่เราต้องการที่จะกลับมาlเมื่อใดก็ตามหรือn==0 l==[]เรารวมสิ่งเหล่านี้โดยการสังเกตว่าสิ่งใดสิ่งหนึ่งทำให้n*lเป็นรายการที่ว่างเปล่าซึ่งเป็นเท็จ ดังนั้นเราจะเรียกคืนเมื่อใดก็ตามที่n*lไม่ว่างเปล่าและกลับมาเป็นlอย่างอื่น

แม้ว่าจะมีการเรียกซ้ำสองfครั้ง แต่ก็ไม่ได้ทำให้เกิดการชี้แจงแบบทวีคูณตามคำจำกัดความซ้ำของตัวเลขฟีโบนักชี แต่ยังคงเป็นกำลังสอง


3

C ++ (61 + 17 = 78 ไบต์)

#include<numeric>
void f(int*a,int*e,int n){for(;n--;)std::partial_sum(a,e,a);}

กรณีทดสอบ:

#include <iostream>
#include <iterator>

int main() {
    int a[] { -3, 4, 7, -1, 15 };
    f(a, std::end(a), 3);
    for (auto i : a)
        std::cout << i << " ";
}

สิ่งนี้ใช้เสรีภาพเล็กน้อยกับสเปค: ใช้อาร์เรย์สไตล์ C ส่งตัวชี้ไปยังจุดเริ่มต้นและจุดสิ้นสุดของอาร์เรย์ ภายในที่คุณสามารถเห็นมันเป็นเพียงมากเสื้อคลุมบาง ๆ รอบstd::partial_sumในห้องสมุดมาตรฐาน แทนที่จะส่งคืนค่าที่เกิดขึ้นจริงเพียงแค่ปรับเปลี่ยนอาร์เรย์ที่ส่งผ่าน

หากเราไม่รังเกียจที่จะผลักดันคำจำกัดความของสิ่งต่าง ๆ ให้ถึงขีด จำกัด (และอีกเล็กน้อย) เราสามารถนิยาม "ฟังก์ชั่น" ในการแสดงออกแลมบ์ดา:

#include<numeric>
#include <iostream>
#include <iterator>

int main() {
    int a[] { -3, 4, 7, -1, 15 };
    int *e = std::end(a);
    int n=3;

    auto f=[&]{for(;n--;)std::partial_sum(a,e,a);};

    f();
    for (auto i : a)
        std::cout << i << " ";
}

สิ่งนี้จะช่วยลดความหมายของฟังก์ชั่น (- วัตถุเหมือน) กับชิ้นนี้:

[&]{for(;n--;)std::partial_sum(a,e,a);};

... สำหรับ 40 bytes (+17 สำหรับ the #include)


Wau ฉันไม่ได้คาดหวังว่า STL จะมี alg สำหรับการนับจำนวนเงินบางส่วน
Zereges

1
@Zereges: ไม่มีใครคาดว่า Spanish Inquisit .... โอ้เดี๋ยวก่อนพวกเรากำลังทำ C ++ ไม่ใช่ Python ขอโทษด้วย.
Jerry Coffin


2

Haskell, 52 47 ไบต์

ครั้งแรกที่เคยใช้รหัส 'พยายาม' กอล์ฟและฉันเป็นผู้เริ่มต้น Haskell เป็นอย่างมากดังนั้นความคิดเห็นจึงยินดีอย่างยิ่ง! มันไม่ชัดเจนในคำถามเกี่ยวกับรูปแบบที่จำเป็นของการเรียกใช้ฟังก์ชั่นหรือว่ามีการโต้แย้งโดยโปรแกรมฉันจึงใช้เครื่องหมายอัศเจรีย์เป็นตัวระบุฟังก์ชันเพื่อบันทึกช่องว่างสองสามอัน

0!a=a
i!a=(i-1)![sum$take j a|j<-[1..length a]]

การใช้งาน (GHCi):

$ ghci partialsums.hs
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( partialsums.hs, interpreted )
Ok, modules loaded: Main.
*Main> 1![-3, 4 ,7 ,-1 ,15]
[-3,1,8,7,22]
*Main> 3![-3, 4 ,7 ,-1 ,15]
[-3,-5,1,14,49]

ยินดีต้อนรับสู่โค้ดกอล์ฟ! 0!a=a i!a=...มันมักจะสั้นจะมีการแข่งขันรูปแบบกว่าที่จะใช้ยามเช่น
xnor

ขอบคุณ @xnor - ฉันเคยใช้ 'xs' เมื่อสร้างรหัสเริ่มต้นและต้องพลาดเมื่อทำการแก้ไขรหัสในโพสต์ แก้ไข
Jake

สำหรับsum(take j a)คุณสามารถหลีกเลี่ยง parens โดยการทำโดยใช้ความสำคัญสูงของsum$take j a $
xnor

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


2

C #, 52 + 85 = 148 137 ไบต์

using E=System.Collections.Generic.IEnumerable<int>;

และ

E I(E s,int i){int t=0;return i<1?s:I(System.Linq.Enumerable.Select(s,v=>t+=v),i-1);}

มันใช้วิธีปฏิบัตินอกรีต ( v=>t+=v) แต่นี่คือ PPCG บันทึกข้อ จำกัด เชิงลึกของสแต็ก


2

Python 3, 73

อาจจะตีกอล์ฟลงอีกเล็กน้อย

def f(n,i):
 p=0;c=[]
 for m in n:p+=m;c+=[p]
 f(c,i-1)if i else print(n)

รุ่นนี้ใช้ numpy ซึ่งให้ความรู้สึกเหมือนโกง แต่นี่คือ:

Python 3 (มีจำนวน), 72

from numpy import*
def f(n,i):
 if i:c=cumsum(n);f(c,i-1)
 else:print(n)

2

C ++ 14, 102 103 94 + 17 (รวม) = 111 ไบต์

#include<vector>
auto f(std::vector<int>a,int n){for(;n--;)for(int i=0;i<a.size()-1;++i)a[i+1]+=a[i];return a;}

Ungolfed พร้อมกรณีทดสอบ

#include <vector>
#include <iostream>

auto f(std::vector<int> a, int n)
{
    for (; n--;)
        for (int i = 0; i < a.size() - 1; ++i)
            a[i + 1] += a[i];
    return a;
}


int main()
{
    auto t = f({-3, 4, 7, -1, 15}, 3);
    for (int i : t)
        std::cout << i << " ";
}

ต้องอาศัยลำดับของการประเมินผล ไม่แน่ใจว่ามันเป็น UB หรือไม่ แต่ทำงานได้มันขึ้นอยู่กับคอมไพเลอร์ฉันเลยเปลี่ยนมัน


แทนที่จะนับjจาก 0 ถึง n ให้นับnลงไปที่ 0 ให้ 97 ไบต์ด้วยการนับของฉัน
Jerry Coffin

@JerryCoffin ขอบคุณ ..
Zereges


1

ล้อเลียน 10 ไบต์

{q++pa}jE!

มันไม่ได้มีประสิทธิภาพมากนัก แต่มันก็ใช้กลอุบาย

blsq ) {-3 4 7 -1 15} 1 {q++pa}jE!
{-3 1 8 7 22}
blsq ) {-3 4 7 -1 15} 3 {q++pa}jE!
{-3 -5 1 14 49}

1

C ++ 14, 67 ไบต์

ในฐานะที่เป็นชื่อแลมบ์ดาการปรับเปลี่ยนปัจจัยการผลิตที่ต้องcเป็น random-access vector<int>ภาชนะเช่น

[](auto&c,int n){while(n--)for(int i=0;i++<c.size();c[i]+=c[i-1]);}


1

เยลลี่ 3 ไบต์

SƤ¡

ลองออนไลน์!

นี่เป็นวิธีการของฉัน ( Mr Xcoder )

เยลลี่ 3 ไบต์

+\¡

ลองออนไลน์!

นี่คือวิธีการแก้ปัญหาของcoinairingaahing

วิธีที่ # 1

SƤ¡ - โปรแกรมเต็มรูปแบบ dyadic

  ¡ - ใช้ซ้ำ ๆ , N ครั้ง
 Ƥ - แมปลิงก์ก่อนหน้าผ่านส่วนนำหน้าของรายการ
S - ผลรวม
     - ผลผลิตโดยปริยาย

วิธีที่ # 2

+ \ ¡ - โปรแกรมเต็มรูปแบบ, dyadic

  ¡ - ใช้ซ้ำ ๆ , N ครั้ง
 \ - ลดการสะสมโดย:
+ - การเพิ่ม

0

ความจริง213 47 ไบต์

m(a,b)==(for i in 1..b repeat a:=scan(+,a,0);a)

ungolf และเป็นตัวอย่าง

 (3) -> [m([-3,4,7,-1,15],1), m([-3,4,7,-1,15],3)]
    Compiling function l with type List Integer -> List Integer
    Compiling function m with type (List Integer,Integer) -> List
       Integer

    (3)  [[- 3,1,8,7,22],[- 3,- 5,1,14,49]]
                                                       Type: List List Integer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.