Tambahkan array dengan sendirinya


22

Tantangan Anda hari ini adalah mengambil array, membaginya menjadi potongan-potongan, dan menambahkan potongan-potongan itu.

Begini cara kerjanya: Program atau fungsi Anda akan diberi array bilangan bulat adan ukuran chunk L. Array harus dibagi menjadi array ukuran L, jika panjang array tidak dapat dibagi pada Lsaat itu maka array harus ditambahkan ke 0 sehingga terbagi rata. Setelah array dipotong, semua potongan harus ditambahkan bersama elemen-bijaksana. Array yang dihasilkan kemudian output.

Anda dapat menganggap Llebih besar dari 0, dan itu aadalah kosong. Anda tidak dapat membuat asumsi bahwa aisinya positif.

Ini sebuah contoh:

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

Kasus uji:

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]

Ini adalah , byte terkecil menang!


Bukankah itu sebuah penipuan?
sergiol

1
@sergiol jika Anda dapat menemukan pertanyaan bahwa ini adalah duplikat dari, saya akan menghapus posting ini sendiri. Namun, sejauh yang saya tahu itu bukan penipuan.
Pavel

Jawaban:


10

MATL , 4 byte

e!Xs

Cobalah online!

Bit kode MATL pertama yang saya tulis! Mengambil dua input, asebagai vektor baris (dipisahkan koma) dan lsebagai angka. Berhasil

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



5

Java 7, 86 byte

Tidak ada lipatan mewah atau matriks, hanya forloop mode ol yang baik :)

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

Cobalah di Ideone

Berjajar:

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
dan dengan Java 7 kuno yang baik (bukan 8). ;)
Kevin Cruijssen


5

JavaScript (ES6), 51 byte

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

Mengambil input dalam sintaks currying: f([1,2])(3).

Uji Kasus


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

1
@Oki Dua byte lebih pendek:, a=>n=>a.map((v,i)=>o[i%=n]=~~o[i]+v,o=[])&&otetapi tidak menambah padding-nol yang diperlukan.
Justin Mariner

f=harus menjadi bagian dari jumlah karakter Anda.
nl-x

1
@ nl-x Fungsi anonim diizinkan secara default, jadi selama saya tidak menggunakan nama fungsi dalam kode saya, f=tidak diperlukan. Inilah satu posting di meta tentang ini.
Justin Mariner

1
@ nl-x: Tidak, seharusnya tidak; suatu fungsi hanya perlu diberi nama jika itu bersifat rekursif (atau, mungkin, quine). Jika tidak maka fungsi anonim benar-benar valid. Lihat di sini .
Shaggy

5

Mathematica, 27 byte

Mathematica hampir memiliki builtin untuk ini

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

Cobalah di Wolfram Sandbox

Pemakaian

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

{12, -1, 0, 1}

Penjelasan

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

Tautan Anda tidak berfungsi.
Shaggy

1
@ Shaggy Anda harus menyalin dan menempelkan kode secara manual. Wolfram Sandbox tidak mendukung input yang diisi sebelumnya.
JungHwan Min

4

Mathematica, 58 byte

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

Memasukkan

[{1}, 3]

Keluaran

{1,0,0}


ini berfungsi untuk [1], 3 Anda dapat mengujinya di sini sandbox.open.wolframcloud.com dengan menambahkan input di akhir kode dan menekan shift + enter
J42161217

4

Perl 6 , 36 byte

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

Menguji

Diperluas:

{  # 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 byte

Dibawa lsebagai argumen kiri dan aargumen kanan.

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

Cobalah online!

{... } fungsi anonim di mana argumen kiri ( l) dan argumen kanan ( a).

≢⍵ penghitungan (panjang) dari a

⍺÷⍨ dibagi dengan l

 langit-langit (bulat)

⍺,⍨ menambahkan l

s← simpan di s(untuk s hape)

×/ produk itu (yaitu berapa banyak bilangan bulat yang dibutuhkan)

⍵↑⍨ ambil banyak bilangan bulat dari a(padding dengan nol)

s⍴r eshape untuk dibentuk s(baris, kolom)

+⌿ jumlah kolom



3

Perl 6 , 40 byte

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

Cobalah online!

Jika Anda suka nomor 42, Anda dapat menukar *untuk . Itu akan membuatnya menjadi 42 byte :—).

Penjelasan :

{[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.

Keajaiban di balik "tambah" terakhir adalah bahwa operator adalah "kurangi dengan zip dengan +". Ngomong-ngomong, ini akan rusak jika kita menggunakannya hanya pada daftar dengan 1 daftar di dalamnya, tetapi itu tidak pernah terjadi jika daftar asli tidak kosong (karena baris kedua-ke-terakhir). Perhatikan juga bahwa kita akhirnya mengambil tidak hanya barang @a, tetapi juga @a * $lbarang. Untungnya kami hanya menambahkan nol yang tidak akan memengaruhi hasil akhir.


3

Sekam , 9 byte

S↑ȯ¡¬Fż+C

Cobalah online!

Penjelasan

        C    Cut into lists of length n
     Fż+     Sum them element-wise
  ȯ¡¬        Append infinitely many 0s
S↑           Take the first n elements

3

Pyth , 8 byte

m+F%Q>vz

Coba di sini!

Pyth , 10 byte

sMCc.[EZQQ

Coba di sini!

Penjelasan

Penjelasan # 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.

Penjelasan # 2

sMCc. [Program lengkap EZQQ.

    [E Pad input kedua ke kanan, dengan salinan berulang ...
       Z ... Nol (0), hingga kelipatan terdekat ...
        Q ... Input pertama.
   c Q Memotong potongan yang sama dengan input pertama.
  C Matriks transpose. Dapatkan semua kolom dari daftar bersarang.
sM Jumlah masing-masing.
             Keluaran (tersirat). 

Bagaimana dengan yang seperti ini:sM.TcEQ
Jakube

@ Jakube Itu tidak benar, karena Anda harus mengisi dengan nol terlebih dahulu. Itu adalah upaya awal Leaky, tetapi akan gagal [1], 3, yang akan memberi [1]bukannya [1, 0, 0].
Tn. Xcoder

Maaf, kesalahan saya.
Jakube

3

J , 15 12 byte

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

Cobalah online!

Penjelasan

]{.+/@(]\~-)  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

Apa alasan kita tidak bisa menyingkirkan kotak itu? Bagaimana dengan [:+/-@[[\]:?
Jonah

@Jonah Jika ukuran chunk lebih besar dari panjang array input, itu tidak akan nol-empuk.
mil

Edit yang bagus - lebih bersih sekarang.
Jonah

3

05AB1E , 8 byte

ô0ζO²Å0+

Cobalah online!

ô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 byte

Å0+¹ô0ζO

Cobalah online!

Å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

Hampir identik dengan solusi saya sendiri: codegolf.stackexchange.com/a/143186/73296
scottinet

@ skottinet Aku pasti melewatkan itu. Mereka cukup berbeda sehingga saya akan meninggalkan milik saya dan mendukung Anda :)
Riley

Saya tidak terlalu keberatan, hanya ingin menunjukkan hal itu :)
scottinet

@ skottinet Sangat menarik bahwa Anda dapat mengatur ulang operasi dan keluar dengan jumlah byte yang sama dan byte yang hampir identik digunakan ( ¹vs ²)
Riley

2

SOGL V0.12 , 14 byte

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

Coba Di Sini! atau Coba semua test case. ini ditulis sebagai fungsi yang tidak disebutkan namanya dan mengharapkan chunk length; arraypada stack.

Penjelasan:

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

Untuk apa Fkode Coba di Sini yang Anda tautkan?
Pavel

@Pavel nama fungsi. Sama seperti di JS f=a=>a+2yang f=sebagian tidak dihitung - di SOGL F\ntidak dihitung.
dzaima

2

05AB1E , 12 byte

gs÷*+Å0¹+ôøO

Cobalah online!

Penjelasan

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

Mathematica, 43 byte

Plus@@#~ArrayReshape~{⌈Tr[1^#]/#2⌉,#2}&


2

R , 62 57 byte

-5 byte terima kasih kepada user2390246

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

Cobalah online!

Diperbarui karena tidak lagi harus menangani kasing kosong.

bantalan adengan nol, membangun matriks lbaris, dan menghitung dan mengembalikan jumlah baris.



@ user2390246 tentu saja! Saya memiliki itu dalam versi yang lebih lama ketika kami harus menangani kasing kosong tapi yang ini adalah "utama" saya dan saya tidak berpikir untuk mencobanya lagi.
Giuseppe

2

Ditumpuk , 24 byte

[:@z#<[0 z rpad]map sum]

Cobalah online!

Penjelasan

[:@z#<[0 z rpad]map sum]
[                      ]   anonymous function
 :@z                       stores TOS as `z` (the length)
    #<                     cut STOS in TOS slices
      [        ]map        for each slice
       0 z rpad               pad the slice with `z` zeroes
                    sum]   summate all inner slices


2

Japt , 7 byte

Sobat, saya bertarung dengan metode Japt yang salah terlalu lama mencoba membuatnya bekerja untuk [1], 3 kasus uji dalam jumlah byte yang wajar!

VÆëVX x

Cobalah


Penjelasan

Input implisit dari array Udan integer V.

Buat array bilangan bulat dari 0ke V-1dan melewati masing-masing melalui fungsi dengan Xmenjadi elemen saat ini.

ëVX

Raih setiap Velemen dari U, mulai dari indeks X.

x

Kurangi array itu dengan tambahan.


2

C, (GCC) 101 86 Bytes

Cobalah online!

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

Pemakaian

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]);
   }
}

Perhatikan bahwa Anda harus memasukkan panjang array dan array dinamis baru pada heap (m).



1

PowerShell , 62 byte

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

Cobalah online!

Kami mengambil input $array dan $length. Kemudian putar dari 1ke $l. Setiap iterasi yang kita atur helper $ymenjadi kurang dari angka saat ini (ini karena PowerShell 0-indeks tetapi $length dalam 1-indexing). Kemudian kita atur $output kita ke 0dan loop lagi ke $l. Setiap iterasi bagian dalam kita terakumulasi menjadi elemen rray yang $odiindeks dengan tepat $a. Ini memanfaatkan fakta bahwa pengindeksan melewati akhir array akan kembali$null dan0 + $null = 0 .

Setelah loop dalam selesai, kami output $odan beralih ke potongan berikutnya. Berbagai output dibiarkan pada pipa dan output melalui implisit Write-Outputterjadi pada penyelesaian program.


1

Perl 5 , 44 + 1 (-a) = 45 byte

@r=(0)x($l=<>);map$r[$i++%$l]+=$_,@F;say"@r"

Cobalah online!

Sunting: memperbaiki case di mana panjang yang diminta lebih kecil dari array input


1

Sekam , 10 byte

Fż+So:`R0C

Cobalah online!

Tidak Terikat / Penjelasan

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

1

Scala 2.12.2 , 80 byte

(a:Array[Int],b:Int)=>(0 to b-1).map(i=>a.indices.filter(_%b==i).collect(a).sum)

Ini sedikit lebih pendek dari solusi Java.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.