เพิ่มอาร์เรย์ด้วยตัวเอง


22

ความท้าทายของคุณในวันนี้คือการจัดเรียงแยกเป็นชิ้น ๆ และเพิ่มชิ้นส่วนเหล่านั้น

นี่คือวิธีการทำงานนี้: โปรแกรมหรือฟังก์ชั่นของคุณจะได้รับอาร์เรย์ของจำนวนเต็มและขนาดก้อนa Lอาเรย์ควรจะแบ่งออกเป็นขนาดของอาร์เรย์Lถ้าความยาวของอาเรย์ไม่สามารถหารได้Lดังนั้นอาเรย์ควรจะมี 0 ต่อท้ายมันเพื่อให้มันหารได้อย่างเท่าเทียมกัน เมื่ออาร์เรย์ถูก chunked ชิ้นทั้งหมดจะถูกรวมเข้าด้วยกันเป็นองค์ประกอบที่ชาญฉลาด อาร์เรย์ที่เป็นผลลัพธ์จะถูกส่งออก

คุณสามารถสันนิษฐานได้ว่าLมีค่ามากกว่า 0 และนั่นaก็ไม่ใช่สิ่งที่ว่างเปล่า คุณไม่สามารถทำการสันนิษฐานได้ว่าaเนื้อหาของเป็นบวก

นี่คือตัวอย่าง:

[1,2,3,4,5,6,7,8], 3 => [1,2,3]+[4,5,6]+[7,8,0] =>  [1+4+7,2+5+8,3+6+0] => [12,15,9]

กรณีทดสอบ:

Array                           Length   Output
[1]                             1        [1]
[1]                             3        [1,0,0]
[0]                             3        [0,0,0]
[1,2]                           3        [1,2,0]
[1,2]                           1        [3]
[-1,1]                          2        [-1,1]
[-7,4,-12,1,5,-3,12,0,14,-2]    4        [12,-1,0,1]
[1,2,3,4,5,6,7,8,9]             3        [12,15,18]

นี่คือ , ไบต์ที่น้อยที่สุดชนะ!


มันไม่ได้เป็นคนล่อ?
sergiol

1
@sergiol หากคุณสามารถค้นหาคำถามที่ซ้ำกันฉันจะลบโพสต์นี้ด้วยตัวเอง อย่างไรก็ตามเท่าที่ฉันสามารถบอกได้ว่าไม่ได้เป็นคนหลงกล
Pavel

คำตอบ:


10

MATL , 4 ไบต์

e!Xs

ลองออนไลน์!

รหัส MATL บิตแรกที่ฉันเขียน! รับสองอินพุตaเป็นเวกเตอร์แถว (คั่นด้วยเครื่องหมายจุลภาค) และlเป็นตัวเลข ผลงานออกมาให้เป็น

e          # reshape `a` into `l` rows (auto pads with 0)
 !         # transpose
  Xs       # sum down the columns



5

Java 7, 86 ไบต์

ไม่มีรอยพับหรือเมทริกซ์แฟนซีเพียงforห่วงol ดี 'แฟชั่น:)

int[]o(int[]a,int l){int i=0,o[]=new int[l];for(;i<a.length;)o[i%l]+=a[i++];return o;}

ลองใช้กับ Ideone

เรียงราย:

int[]o(int[]a,int l){
    int i=0,
        o[]=new int[l];
    for(;i<a.length;)
        o[i%l]+=a[i++];
    return o;
}

2
และด้วยความดี ol 'fashioned Java 7 (แทน 8) ;)
Kevin Cruijssen


5

JavaScript (ES6), 51 ไบต์

a=>n=>a.map((v,i)=>o[i%n]+=v,o=Array(n).fill(0))&&o

จะเข้าในไวยากรณ์ f([1,2])(3)currying:

กรณีทดสอบ


(a,n,o=[])=>a.map((v,i)=>o[i%n]=~~o[i%n]+v)&&o
Oki

1
@ โอกิสั้นลงสองไบต์: a=>n=>a.map((v,i)=>o[i%=n]=~~o[i]+v,o=[])&&oแต่มันไม่ได้เพิ่มการเติมศูนย์ที่ต้องการ
Justin Mariner

f=ควรเป็นส่วนหนึ่งของตัวละครของคุณ
nl-x

1
@nl-x ฟังก์ชั่นที่ไม่ระบุชื่อได้รับอนุญาตโดยค่าเริ่มต้นตราบใดที่ฉันไม่ได้ใช้ชื่อฟังก์ชั่นในรหัสของฉันf=ก็ไม่จำเป็น นี่คือหนึ่งโพสต์ในเมตาเกี่ยวกับเรื่องนี้
Justin Mariner

1
@ nl-x: ไม่ไม่ควร; ฟังก์ชั่นจำเป็นต้องมีชื่อถ้ามันซ้ำ (หรืออาจจะเป็นควิน) หากไม่ใช่ฟังก์ชันที่ไม่ระบุตัวตนก็ใช้ได้อย่างสมบูรณ์ ดูที่นี่
Shaggy

5

Mathematica ขนาด 27 ไบต์

Mathematica เกือบจะมี builtin สำหรับสิ่งนี้

Total@Partition[##,#2,1,0]&

ลองใช้กับ Wolfram Sandbox

การใช้

Total@Partition[##,#2,1,0]&[{-7, 4, -12, 1, 5, -3, 12, 0, 14, -2}, 4]

{12, -1, 0, 1}

คำอธิบาย

Total@Partition[##,#2,1,0]&

      Partition[##,#2,1,0]   (* Partition the first input into sublists of length
                                second input, using offset second input, and
                                right-pad zeroes for incomplete partitions *)
Total@                       (* Add all *)

ลิงก์ของคุณไม่ทำงาน
Shaggy

1
@Shaggy คุณต้องคัดลอกและวางรหัสด้วยตนเอง Wolfram Sandbox ไม่รองรับอินพุตที่เติมไว้ล่วงหน้า
JungHwan Min

4

Mathematica, 58 ไบต์

Total@Partition[PadRight[#,(s=Length@#)+Mod[-s,#2]],{#2}]&

อินพุต

[{1}, 3]

เอาท์พุต

{1,0,0}


ใช้งานได้กับ [1], 3 คุณสามารถทดสอบได้ที่นี่ sandbox.open.wolframcloud.com โดยการเพิ่มอินพุตที่ส่วนท้ายของรหัสและกด shift + enter
J42161217

4

Perl 6 , 36 ไบต์

{[Z+] flat(@^a,0 xx$^b*2).rotor($b)}

ทดสอบมัน

ขยาย:

{  # bare block lambda with 2 placeholder parameters 「@a」, 「$b」
  [Z+]
    flat(
      @^a,         # declare and use the first parameter
      0 xx $^b * 2 # 0 list repeated 2 * the second parameter
    )
    .rotor($b)     # split into chunks that are the size of the second param
}
[1,2], 3

( [1,2], (0,0,0,0,0,0) ) # @^a,0 xx$^b*2
(1,2,0,0,0,0,0,0)        # flat(…)
( (1,2,0), (0,0,0) )     # .rotor($b) # (drops partial lists)
(1,2,0)                  # [Z+]

3

APL (Dyalog) 22 ไบต์

รับlอาร์กิวเมนต์ด้านซ้ายและอาร์กิวเมนต์aที่ถูกต้อง

{+⌿s⍴⍵↑⍨×/s←⍺,⍨⌈⍺÷⍨≢⍵}

ลองออนไลน์!

{} ฟังก์ชั่นที่ไม่ระบุชื่อโดยที่อาร์กิวเมนต์ซ้าย ( l) และอาร์กิวเมนต์ขวา ( a)

≢⍵ tally (ความยาว) ของ a

⍺÷⍨ หารด้วย l

 เพดาน (ปัดขึ้น)

⍺,⍨ ผนวก l

s← เก็บในs(สำหรับs hape)

×/ ผลิตภัณฑ์ของสิ่งนั้น (เช่นจำนวนเต็มจำเป็นต้องมี)

⍵↑⍨ ใช้จำนวนเต็มจำนวนมากจาก a (padding ด้วยศูนย์)

s⍴R eshape เพื่อจัดรูปร่างs(แถว, คอลัมน์)

+⌿ ผลรวมคอลัมน์



3

Perl 6 , 40 ไบต์

{[Z+] (|@^a,|(0 xx*)).rotor($^l)[0..@a]}

ลองออนไลน์!

หากคุณชอบหมายเลข 42 คุณสามารถสลับ*เป็นการนั่นจะทำให้เป็น 42 ไบต์ :—)

คำอธิบาย :

{[Z+] (|@^a,|(0 xx*)).rotor($^l)[0..@a]} The whole function
{                                      } Anonymous block
      (    ,        )                    List with 2 elements
        @^a                              The first argument (it is a list)
             (0 xx*)                     Infinite list of zeroes
       |    |                            Flatten both of the lists into the larger list.
                    .rotor($^l)          Split the list into a list of lists, each (the second argument) long.
                               [0..@a]   Only the first (1 + length of the first argument) of them.
 [Z+]                                    Add the corresponding elements up.

ความมหัศจรรย์ที่อยู่เบื้องหลัง "เพิ่มขึ้น" ล่าสุดคือผู้ใช้งานคือ "ลดด้วย zip ด้วย +" โดยวิธีการนี้จะพังถ้าเราใช้มันเฉพาะในรายการที่มี 1 รายการภายใน แต่ไม่เคยเกิดขึ้นหากรายการเดิมไม่ว่างเปล่า (เนื่องจากแถวที่สองถึงครั้งสุดท้าย) นอกจากนี้โปรดทราบว่าเราจะไม่เพียง@aแต่รับ แต่@a * $lสินค้าเท่านั้น โชคดีที่เราเพิ่มเฉพาะศูนย์ซึ่งไม่ส่งผลต่อผลลัพธ์สุดท้าย



3

Pyth , 8 ไบต์

m+F%Q>vz

ลองที่นี่!

Pyth , 10 ไบต์

sMCc.[EZQQ

ลองที่นี่!

คำอธิบาย

คำอธิบาย # 1

m+F%Q>vz   Full program. Q means input.

m          Map over the implicit range [0, input_1), with a variable d.
     >vz  All the elements of input_2 after d; input_2[d:] in Python.
   %Q     Every Qth element of ^.
 +F       Sum. Implicitly output the result.

คำอธิบาย # 2

sMCc. [โปรแกรม EZQQ เต็มรูปแบบ

    . [E Pad อินพุตที่สองทางด้านขวาพร้อมสำเนาซ้ำของ ...
       Z ... ศูนย์ (0), ทวีคูณของ ...
        คำถาม ... อินพุตแรก
   c Q สับเป็นชิ้นส่วนของความยาวเท่ากับอินพุตแรก
  C Matrix ทรานส รับคอลัมน์ทั้งหมดของรายการที่ซ้อนกัน
sM หาผลรวมกัน
             เอาท์พุท (โดยปริยาย) 

เกี่ยวกับบางสิ่งเช่นนี้:sM.TcEQ
Jakube

@Jakube นั่นไม่ถูกต้องเพราะคุณต้องใช้เลขศูนย์ก่อน นั่นคือความพยายามเริ่มต้นของ Leaky แต่จะล้มเหลว[1], 3ซึ่งจะให้[1]แทน[1, 0, 0]แทน
Mr. Xcoder

ขอโทษที่ฉันทำผิด
Jakube

3

J , 15 12 ไบต์

]{.+/@(]\~-)

ลองออนไลน์!

คำอธิบาย

]{.+/@(]\~-)  Input: array A (LHS), chunk size L (RHS)
          -   Negate L
       ]\~    Take each non-overlapping sublist of size L in A
   +/@        Reduce the columns by addition
]             Get L
 {.           Take that many, filling with 0's

เหตุผลใดที่เราไม่สามารถทำได้ด้วยกล่อง? สิ่งที่เกี่ยวกับ: [:+/-@[[\]?
โจนาห์

@Jonah ถ้าขนาดของก้อนใหญ่กว่าความยาวของอาร์เรย์ที่ใส่เข้าไปมันจะไม่เป็นศูนย์
ไมล์

การแก้ไขดี - สะอาดกว่าตอนนี้
โจนาห์

3

05AB1E , 8 ไบต์

ô0ζO²Å0+

ลองออนไลน์!

ô0ζO²Å0+   Full program
ô          Push <1st input> split into a list of <2nd input> pieces
 0ζ        Zip sublists with 0 as a filler
   O       Sum each sublist
           --- from here, the program handles outputs shorter 
               than the required length
    ²Å0    Push a list of zeros of length <2nd input>
       +   Sum the result with that list

3

05AB1E , 8 ไบต์

Å0+¹ô0ζO

ลองออนไลน์!

Å0       # Push an arrary of all 0s with length l
  +      # Add that to the array
   ¹ô    # Split into chunks of length l
     0ζ  # Zip, padding with 0s
       O # Sum each chunk

เกือบเหมือนโซลูชันของฉัน: codegolf.stackexchange.com/a/143186/73296
scottinet

@ scottinet ฉันต้องพลาดแน่ พวกเขามีความแตกต่างกันมากพอที่ฉันจะปล่อยให้ผมและคุณ upvote :)
ไรลีย์

ฉันไม่เป็นไรแค่อยากจะชี้ให้เห็นว่า :)
scottinet

@scottinet เป็นที่น่าสนใจที่คุณสามารถจัดเรียงการดำเนินการและออกมาด้วยจำนวนไบต์เดียวกันและไบต์ที่เหมือนกันเกือบใช้ ( ¹vs ²)
Riley

2

SOGL V0.12 , 14 ไบต์

l⁵%⁵κ{0+}nI⌡∑¹

ลองที่นี่! หรือลองใช้กรณีทดสอบทั้งหมด นี่เขียนเป็นฟังก์ชันที่ไม่มีชื่อและคาดว่าจะchunk length; arrayอยู่ในสแต็ก

คำอธิบาย:

padding zeroes
l          get the array's length
 ⁵%        modulo the chunk length
   ⁵κ      chunk length - result of above
     {  }  that many times
      0+     append a 0 to the array

adding the array together
n      split into the chunks
 I     rotate clockwise
  ⌡    for each
   ∑     sum
    ¹  wrap the results in an array

สิ่งที่Fอยู่ในลองได้ที่นี่คุณเชื่อมโยงรหัส?
Pavel

@Pavel ชื่อฟังก์ชั่น เช่นเดียวกับใน JS ส่วนหนึ่งจะไม่นับ - ใน SOGL จะไม่นับ f=a=>a+2f=F\n
dzaima

2

05AB1E , 12 ไบต์

gs÷*+Å0¹+ôøO

ลองออนไลน์!

คำอธิบาย

gs÷*+Å0¹+ôøO
g            # Get the length of the first input (the array)
 s           # Push the second input on top of the result
  ÷          # integer divide the two values
   *         # Multiply with the second input (the length)...
    +        # and add the second input to the result
     Å0      # Create a list of zeros with that length
       ¹+    # Add it to the first input
         ô   # And finally split it into chunks of the input length...
          ø  # ...transpose it...
           O # and sum each resulting subarray
             # Implicit print



2

R , 62 57 ไบต์

-5 ไบต์ขอบคุณ user2390246

function(a,l)rowSums(matrix(c(a,rep(0,l-sum(a|1)%%l)),l))

ลองออนไลน์!

อัปเดตเนื่องจากไม่จำเป็นต้องจัดการกับกรณีที่ว่างเปล่าอีกต่อไป

pads aกับศูนย์สร้างเมทริกซ์ของlแถวและคำนวณและส่งกลับผลรวมแถว



@ user2390246 แน่นอน! ฉันมีรุ่นเก่ากว่าเมื่อเราต้องจัดการกับกรณีที่ว่างเปล่า แต่อันนี้เป็น "หลัก" ของฉันและฉันไม่คิดว่าจะลองอีกครั้ง
Giuseppe



2

Japtap , 7 ไบต์

ชายฉันต่อสู้ด้วยวิธี Japt ผิดที่พยายามนานเกินไปที่จะทำให้มันทำงานใน[1], 3กรณีทดสอบด้วยจำนวนไบต์ที่สมเหตุสมผล!

VÆëVX x

ลองมัน


คำอธิบาย

การป้อนข้อมูลโดยปริยายของอาร์เรย์และจำนวนเต็มUV

สร้างอาร์เรย์ของจำนวนเต็มตั้งแต่0ถึงV-1และผ่านแต่ละฟังก์ชันผ่านการXเป็นองค์ประกอบปัจจุบัน

ëVX

คว้าทุกVองค์ประกอบของวันเริ่มต้นที่ดัชนีUX

x

ลดอาร์เรย์นั้นด้วยการเพิ่ม


2

C, (GCC) 101 86 ไบต์

ลองออนไลน์!

f(int*a,int l,int s,int*m){if(s){int i=l;while(i&&s){m[l-i--]+=*a++;s--;}f(a,l,s,m);}}

การใช้

int main() {
   int l = 3;
   int a[8] = {1,2,3,4,5,6,7,8};
   int *m = (int *)malloc(sizeof(int) * l);
   f(a, l, 8, m);
   for (int i=0; i<3; i++) {
    printf("%d, ",m[i]);
   }
}

โปรดทราบว่าคุณต้องผ่านความยาวของอาร์เรย์และอาร์เรย์แบบไดนามิกใหม่บนฮีป (m)


73 ไบต์
Jonathan Frech

1

PowerShell , 62 ไบต์

param($a,$l)1..$l|%{$y=--$_;($o=0)..$l|%{$o+=$a[$y+$_*$l]};$o}

ลองออนไลน์!

เรารับอินพุต$aเรย์และ$length ห่วงแล้วจากไป1 $lการวนซ้ำแต่ละครั้งที่เรากำหนด$yให้ผู้ช่วยหนึ่งหมายเลขน้อยกว่าหมายเลขปัจจุบัน (นี่เป็นเพราะ PowerShell 0 ดัชนี แต่ส่วนที่$lอยู่ในการจัดทำดัชนี 1) จากนั้นเราตั้งของเรา$output ไปและห่วงอีกครั้งขึ้นไป0 $lการวนซ้ำภายในแต่ละครั้งเราแค่รวบรวมเข้า$oกับ$aองค์ประกอบเรย์ที่จัดทำดัชนีอย่างเหมาะสม นี้ใช้ประโยชน์จากความจริงที่ว่าการจัดทำดัชนีที่ผ่านมาในตอนท้ายของผลตอบแทนอาร์เรย์และ$null0 + $null = 0

เมื่อวนลูปเสร็จแล้วเราจะเอาท์พุท$oและไปยังอันถัดไป เอาต์พุตต่าง ๆ จะถูกปล่อยไว้ที่ไพพ์ไลน์และเอาต์พุตผ่านทาง implicit Write-Outputเกิดขึ้นเมื่อโปรแกรมเสร็จสิ้น



1

Huskขนาด 10 ไบต์

Fż+So:`R0C

ลองออนไลน์!

Ungolfed / คำอธิบาย

             -- implicit inputs n & xs                   | 3  [1,2,3,4]
   S      C  -- cut xs into sublists of length n & ...   | [[1,2,3], [4]]
    (:`R0)   -- ... prepend [0,...,0] (length n)         | [[0,0,0], [1,2,3], [4]]
F            -- accumulate the sublists with             |
 ż+          -- element-wise addition                    | [0+1+4, 0+2, 0+3]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.