Dodaj tablicę z samym sobą

22

Twoim wyzwaniem dzisiaj jest zabranie tablicy, podzielenie jej na części i dodanie tych części.

Oto jak to działa: Twój program lub funkcja otrzyma tablicę liczb całkowitych ai wielkość porcji L. Tablica powinna być podzielona na tablice o rozmiarze L, jeśli długość tablicy nie jest podzielna, Lwówczas tablica powinna mieć do niej dołączone zera, aby była równomiernie podzielna. Gdy tablica zostanie podzielona na fragmenty, wszystkie fragmenty należy dodać razem pod względem elementów. Powstała tablica jest następnie wyprowadzana.

Możesz założyć, że Ljest większa niż 0, a to nie ajest puste. Nie można założyć, że azawartość jest dodatnia.

Oto przykład:

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

Przypadki testowe:

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]

To jest , wygrywa najmniej bajtów!

Pavel
źródło
Czy to nie dupek?
sergiol
1
@sergiol, jeśli możesz znaleźć pytanie, które jest duplikatem, sam usunę ten post. Jednak, o ile mogę stwierdzić, to nie jest dupek.
Pavel

Odpowiedzi:

10

MATL , 4 bajty

e!Xs

Wypróbuj online!

Pierwszy kawałek kodu MATL, który napisałem! Przyjmuje dwa dane wejściowe, ajako wektor wiersza (oddzielony przecinkami) i ljako liczba. Działa

e          # reshape `a` into `l` rows (auto pads with 0)
 !         # transpose
  Xs       # sum down the columns
Giuseppe
źródło
14

Python 3 , 67 65 42 bajtów

Wykorzystuje fakt, że suma pustej tablicy wynosi 0

lambda x,y:[sum(x[i::y])for i in range(y)]

Wypróbuj online!

Halvard Hummel
źródło
7

Galaretka , 7 6 bajtów

1 bajt dzięki Dennisowi.

;0$¡sS

Wypróbuj online!

Leaky Nun
źródło
Dzięki nowszej wersji Jelly możesz to zrobić Ż¡sS(odpowiednik 0;$¡sS).
Erik the Outgolfer
5

Java 7, 86 bajtów

Żadnych fantazyjnych fałd ani matryc, po prostu dobra, staroświecka forpętla :)

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

Wypróbuj na Ideone

Prążkowany:

int[]o(int[]a,int l){
    int i=0,
        o[]=new int[l];
    for(;i<a.length;)
        o[i%l]+=a[i++];
    return o;
}
Geobity
źródło
2
i z dobrą, staroświecką Javą 7 (zamiast 8). ;)
Kevin Cruijssen
5

JavaScript (ES6), 51 bajtów

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

Trwa wejście w składni currying: f([1,2])(3).

Przypadki testowe

Justin Mariner
źródło
(a,n,o=[])=>a.map((v,i)=>o[i%n]=~~o[i%n]+v)&&o
Oki
1
@Oki Dwa bajty krótsze:, a=>n=>a.map((v,i)=>o[i%=n]=~~o[i]+v,o=[])&&oale nie dodaje wymaganego dopełniania zera.
Justin Mariner,
f=powinno być częścią twojej liczby postaci.
nl-x
1
@ nl-x Funkcje anonimowe są domyślnie dozwolone, więc dopóki nie używam nazwy funkcji w kodzie, f=nie jest potrzebne. Oto jeden post na meta na ten temat.
Justin Mariner,
1
@ nl-x: Nie, nie powinno; funkcja musi zostać nazwana tylko wtedy, gdy jest rekurencyjna (lub być może quine). Jeśli nie, funkcja anonimowa jest całkowicie poprawna. Zobacz tutaj .
Shaggy,
5

Mathematica, 27 bajtów

Mathematica prawie do tego ma wbudowaną funkcję

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

Wypróbuj na Wolfram Sandbox

Stosowanie

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

{12, -1, 0, 1}

Wyjaśnienie

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 *)
JungHwan Min
źródło
Twój link nie działa.
Shaggy,
1
@Shaggy musisz ręcznie skopiować i wkleić kod. Wolfram Sandbox nie obsługuje wstępnie wypełnionych danych wejściowych.
JungHwan Min
4

Mathematica, 58 bajtów

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

Wkład

[{1}, 3]

Wydajność

{1,0,0}

J42161217
źródło
działa to dla [1], 3 Możesz to przetestować tutaj sandbox.open.wolframcloud.com , dodając dane wejściowe na końcu kodu i naciskając Shift + Enter
J42161217
4

Perl 6 , 36 bajtów

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

Sprawdź to

Rozszerzony:

{  # 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+]
Brad Gilbert b2gills
źródło
3

APL (Dyalog) , 22 bajty

Przyjmuje ljako lewy argument i aprawy argument.

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

Wypróbuj online!

{} Anonimowa funkcja gdzie lewy argument ( l) i prawy argument ( a).

≢⍵ tally (długość) z a

⍺÷⍨ podzielić przez l

 sufit (zaokrąglony w górę)

⍺,⍨ dodać l

s← przechowywać w s(dla s hape)

×/ iloczyn tego (tj. ile liczb całkowitych jest potrzebnych)

⍵↑⍨ weź tyle liczb całkowitych a(wypełnienie zerami)

s⍴R eshape kształtu s(wiersze, kolumny)

+⌿ sumy kolumnowe

Adám
źródło
3

Perl 6 , 40 bajtów

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

Wypróbuj online!

Jeśli podoba Ci się liczba 42, możesz zamienić na *na . To sprawi, że będzie to 42 bajty :—).

Objaśnienie :

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

Magia kryjąca się za ostatnim „dodaniem” polega na tym, że operator „redukuje za pomocą zip za pomocą +”. Nawiasem mówiąc, to by się zepsuło, gdybyśmy użyli go tylko na liście z 1 listą w środku, ale to się nigdy nie zdarzy, jeśli oryginalna lista nie będzie pusta (z powodu drugiego do ostatniego wiersza). Zauważ też, że ostatecznie zabieramy nie tylko przedmioty @a, ale także @a * $lprzedmioty. Na szczęście dodaliśmy tylko zera, które nie wpłyną na końcowy wynik.

Ramillies
źródło
3

Łuska , 9 bajtów

S↑ȯ¡¬Fż+C

Wypróbuj online!

Wyjaśnienie

        C    Cut into lists of length n
     Fż+     Sum them element-wise
  ȯ¡¬        Append infinitely many 0s
S↑           Take the first n elements
H.PWiz
źródło
3

Pyth , 8 bajtów

m+F%Q>vz

Wypróbuj tutaj!

Pyth , 10 bajtów

sMCc.[EZQQ

Wypróbuj tutaj!

Wyjaśnienie

Wyjaśnienie nr 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.

Wyjaśnienie nr 2

sMCc. [EZQQ Pełny program.

    . [E Pad drugie wejście z prawej strony, z powtarzanymi kopiami ...
       Z ... zero (0), do najbliższej wielokrotności ...
        Q ... Pierwsze wejście.
   c Q Posiekaj na kawałki o długości równej pierwszemu wejściowi.
  C Matryca transponowana. Pobierz wszystkie kolumny listy zagnieżdżonej.
sM Sumuj każdy.
             Dane wyjściowe (domyślnie). 
Pan Xcoder
źródło
A może coś takiego:sM.TcEQ
Jakube,
@Jakube To niepoprawne, ponieważ najpierw musisz wpisać zera. To była pierwsza próba Leaky'ego, ale nie powiodła się [1], 3, co dałoby [1]zamiast [1, 0, 0].
Pan Xcoder,
Przepraszam, mój błąd.
Jakube,
3

J , 15 12 bajtów

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

Wypróbuj online!

Wyjaśnienie

]{.+/@(]\~-)  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
mile
źródło
Czy jest jakiś powód, dla którego nie możemy pozbyć się pudeł? Co z [:+/-@[[\]:?
Jonah
@Jonah Jeśli wielkość porcji jest większa niż długość tablicy wejściowej, nie będzie ona zerowana.
mile
Niezła edycja - teraz znacznie czystsza.
Jonasz
3

05AB1E , 8 bajtów

ô0ζO²Å0+

Wypróbuj 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
szkocki
źródło
3

05AB1E , 8 bajtów

Å0+¹ô0ζO

Wypróbuj 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
Riley
źródło
Prawie identyczne z moim własnym rozwiązaniem: codegolf.stackexchange.com/a/143186/73296
scottinet
@scottinet Musiałem tego przegapić. Są na tyle różne, że opuszczę moje i będę głosować twoje :)
Riley,
Nie mam nic przeciwko, chciałem tylko to podkreślić :)
scottinet,
@ scottinet Interesujące jest to, że możesz zmienić kolejność operacji i wyjść z tą samą liczbą bajtów i prawie identycznymi bajtami użytymi ( ¹vs ²)
Riley
2

SOGL V0.12 , 14 bajtów

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

Wypróbuj tutaj! lub Wypróbuj wszystkie przypadki testowe. jest to zapisane jako funkcja bez nazwy i oczekuje chunk length; arrayna stosie.

Wyjaśnienie:

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
dzaima
źródło
Do czego Fsłuży połączony kod Wypróbuj tutaj?
Pavel
@Pavel nazwę funkcji. Tak samo jak w JS część nie jest liczony - w SOGL nie jest liczony. f=a=>a+2f=F\n
dzaima
2

05AB1E , 12 bajtów

gs÷*+Å0¹+ôøO

Wypróbuj online!

Wyjaśnienie

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
Datboi
źródło
2

Mathematica, 43 bajty

Plus@@#~ArrayReshape~{⌈Tr[1^#]/#2⌉,#2}&
ngenisis
źródło
2

R , 62 57 bajtów

-5 bajtów dzięki user2390246

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

Wypróbuj online!

Zaktualizowano, ponieważ nie musi już obsługiwać pustej skrzynki.

wstawia azera, konstruuje macierz lwierszy oraz oblicza i zwraca sumy wierszy.

Giuseppe
źródło
57 bajtów
użytkownik2390246
@ user2390246 oczywiście! Miałem to w starszej wersji, kiedy musieliśmy obsługiwać pustą skrzynkę, ale ta była moją „podstawową” i nie pomyślałem, aby spróbować ponownie.
Giuseppe,
2

Ułożone , 24 bajty

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

Wypróbuj online!

Wyjaśnienie

[:@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
Conor O'Brien
źródło
2

Japt , 7 bajtów

Człowieku, zbyt długo walczyłem z niewłaściwą metodą Japt, próbując zmusić ją do działania w [1], 3przypadku testowym w rozsądnej ilości bajtów!

VÆëVX x

Spróbuj


Wyjaśnienie

Domniemane wprowadzanie tablicy Ui liczby całkowitej V.

Wygeneruj tablicę liczb całkowitych od 0do V-1i przepuść każdą przez funkcję Xbędącą bieżącym elementem.

ëVX

Chwyć każdy Velement U, zaczynając od indeksu X.

x

Zmniejsz tę tablicę poprzez dodanie.

Kudłaty
źródło
2

C, (GCC) 101 86 bajtów

Wypróbuj 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);}}

Stosowanie

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

Pamiętaj, że musisz podać długość tablicy (-ów) i nową tablicę dynamiczną na stercie (m).

Śpi
źródło
73 bajty .
Jonathan Frech
1

PowerShell , 62 bajty

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

Wypróbuj online!

Bierzemy $atablicę wejściową i ength $l. Następnie zapętlić od 1do $l. Każda iteracja ustawiamy helpera $yo jeden mniej niż bieżąca liczba (dzieje się tak, ponieważ PowerShell 0-indeksuje, ale $length ma 1-indeksowanie). Następnie ustawiamy nasz $output na 0i ponownie zapętlamy do $l. Każda wewnętrzna iteracja po prostu kumulujemy w $oodpowiednio indeksowanym $aelemencie tablicy. Wykorzystuje to fakt, że indeksowanie poza końcem tablicy zwraca $nulli 0 + $null = 0.

Po zakończeniu pętli wewnętrznej wysyłamy dane $oi przechodzimy do następnej porcji. Różne wyniki są pozostawione w potoku, a dane wyjściowe za pośrednictwem niejawnego mają Write-Outputmiejsce po zakończeniu programu.

AdmBorkBork
źródło
1

Perl 5 , 44 + 1 (-a) = 45 bajtów

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

Wypróbuj online!

Edycja: naprawiono przypadek, w którym żądana długość była mniejsza niż tablica wejściowa

Xcali
źródło
1

Łuska , 10 bajtów

Fż+So:`R0C

Wypróbuj online!

Niegolfowane / Wyjaśnienie

             -- 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]
ბიმო
źródło
1

Scala 2.12.2 , 80 bajtów

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

Jest nieco krótszy niż rozwiązanie Java.

Aria Axe
źródło