Aggiungi un array con se stesso


22

La tua sfida oggi è quella di prendere un array, dividerlo in blocchi e aggiungere quei pezzi.

Ecco come funziona: al tuo programma o funzione verrà assegnata una matrice di numeri interi ae una dimensione di blocco L. L'array deve essere suddiviso in matrici di dimensioni L, se la lunghezza dell'array non è divisibile per Lallora l'array dovrebbe avere gli 0 aggiunti ad esso in modo che sia uniformemente divisibile. Una volta che l'array è suddiviso in blocchi, tutti i blocchi devono essere aggiunti insieme in base all'elemento. L'array risultante viene quindi emesso.

Si può presumere che Lsia maggiore di 0 e che asia non vuoto. Non si può fare l'ipotesi che a's contenuti sono positivi.

Ecco un esempio:

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

Casi test:

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]

Questo è , vince meno byte!


Non è un imbecille?
sergiol,

1
@sergiol se riesci a trovare una domanda di cui è un duplicato, eliminerò questo post da solo. Tuttavia, per quanto ne so, non è un imbecille.
Pavel,

Risposte:


10

MATL , 4 byte

e!Xs

Provalo online!

Primo pezzo di codice MATL che ho scritto! Accetta due input, acome vettore di riga (separato da virgola) e lcome numero. Risolve essere

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



5

Java 7, 86 byte

Nessuna piega o matrici fantasiose, solo un buon vecchio forciclo :)

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

Provalo su Ideone

allineato:

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
e con il buon vecchio stile Java 7 (invece di 8). ;)
Kevin Cruijssen,


5

JavaScript (ES6), 51 byte

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

Riceve l'input nella sintassi accattivarsi: f([1,2])(3).

Casi test


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

1
@Oki Due byte più corti:, a=>n=>a.map((v,i)=>o[i%=n]=~~o[i]+v,o=[])&&oma non aggiunge lo zero padding richiesto.
Justin Mariner,

f=dovrebbe far parte del conteggio dei personaggi.
nl-x

1
@ nl-x Le funzioni anonime sono consentite per impostazione predefinita, quindi finché non sto usando il nome della funzione nel mio codice, f=non è necessario. Ecco un post su meta su questo.
Justin Mariner,

1
@ nl-x: No, non dovrebbe; una funzione deve essere nominata solo se ricorsiva (o, forse, una quine). In caso contrario, una funzione anonima è perfettamente valida. Vedi qui .
Shaggy,

5

Mathematica, 27 byte

Mathematica aveva quasi incorporato una cosa per questo

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

Provalo su Wolfram Sandbox

uso

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

{12, -1, 0, 1}

Spiegazione

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

Il tuo link non funziona.
Shaggy,

1
@Shaggy devi copiare e incollare manualmente il codice. Wolfram Sandbox non supporta input pre-riempiti.
JungHwan Min,

4

Mathematica, 58 byte

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

Ingresso

[{1}, 3]

Produzione

{1,0,0}


funziona per [1], 3 Puoi testarlo qui sandbox.open.wolframcloud.com aggiungendo input alla fine del codice e premendo shift +
invio

4

Perl 6 , 36 byte

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

Provalo

Allargato:

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

Prende lcome argomento di sinistra e aargomento di destra.

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

Provalo online!

{... } funzione anonima dove si trova l'argomento left ( l) e l'argomento right ( a).

≢⍵ conteggio (lunghezza) di a

⍺÷⍨ dividi per l

 soffitto (arrotondato per eccesso)

⍺,⍨ aggiungere l

s← conservare in s(per s hape)

×/ prodotto di quello (cioè quanti numeri interi sono necessari)

⍵↑⍨ prende così tanti numeri interi da a(riempimento con zeri)

s⍴r eshape alla forma s(righe, colonne)

+⌿ somme colonnari



3

Perl 6 , 40 byte

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

Provalo online!

Se ti piace il numero 42, puoi scambiare il *con un . Ciò renderà 42 byte :—).

Spiegazione :

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

La magia dietro l'ultimo "add up" è che l'operatore è un "riduci con zip con +". A proposito, questo si spezzerebbe se lo usassimo solo in un elenco con 1 elenco all'interno, ma ciò non accadrebbe mai se l'elenco originale fosse non vuoto (a causa della penultima riga). Si noti inoltre che alla fine prendiamo non solo @a, ma anche @a * $loggetti. Fortunatamente abbiamo aggiunto solo zero che non influiranno sul risultato finale.


3

Buccia , 9 byte

S↑ȯ¡¬Fż+C

Provalo online!

Spiegazione

        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

Provalo qui!

Pyth , 10 byte

sMCc.[EZQQ

Provalo qui!

Spiegazione

Spiegazione n. 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.

Spiegazione n. 2

sMCc. [EZQQ Programma completo.

    . [E Pad il secondo input a destra, con copie ripetute di ...
       Z ... Zero (0), fino al multiplo più vicino di ...
        Q ... Il primo input.
   c Q Tagliare a pezzi di lunghezza uguale al primo input.
  C Matrix transpose. Ottieni tutte le colonne dell'elenco nidificato.
sM Sum ciascuno.
             Uscita (implicitamente). 

Che ne dici di qualcosa del genere:sM.TcEQ
Jakube,

@Jakube Questo non è corretto, poiché prima devi fare il pad con gli zeri. Quello era il tentativo iniziale di Leaky, ma non ci sarebbe riuscito [1], 3, il che avrebbe dato [1]invece di [1, 0, 0].
Mr. Xcoder,

Scusa, errore mio.
Jakube,

3

J , 15 12 byte

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

Provalo online!

Spiegazione

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

Qualche motivo per cui non possiamo eliminare le scatole? Che dire di [:+/-@[[\]:?
Giona,

@Jonah Se la dimensione del blocco è maggiore della lunghezza dell'array di input, non sarà a zero.
miglia

Bella modifica - molto più pulita ora.
Giona,

3

05AB1E , 8 byte

ô0ζO²Å0+

Provalo 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

Provalo 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

Quasi identico alla mia soluzione: codegolf.stackexchange.com/a/143186/73296
scottinet,

@scottinet Devo averlo perso. Sono abbastanza diversi che lascerò il mio e voterò il tuo :)
Riley,

Non mi dispiace, volevo solo precisarlo :)
scottinet,

@scottinet È interessante poter riorganizzare le operazioni ed uscire con lo stesso numero di byte e byte quasi identici usati ( ¹vs ²)
Riley

2

SOGL V0.12 , 14 byte

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

Provalo qui! oppure Prova tutti i casi di test.questo è scritto come una funzione senza nome e si aspetta chunk length; arraynello stack.

Spiegazione:

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

A cosa Fserve il codice Prova qui che hai collegato?
Pavel,

@Pavel il nome delle funzioni. Come in JS f=a=>a+2la f=parte non viene conteggiata, in SOGL F\nnon viene conteggiata.
dzaima,

2

05AB1E , 12 byte

gs÷*+Å0¹+ôøO

Provalo online!

Spiegazione

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 grazie all'utente2390246

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

Provalo online!

Aggiornato poiché non deve più gestire il caso vuoto.

pad acon zeri, costruisce una matrice di lrighe, calcola e restituisce le somme di riga.



@utente2390246 ovviamente! L'ho avuto in una versione precedente quando dovevamo gestire il caso vuoto, ma questo era il mio "principale" e non pensavo di riprovare.
Giuseppe,

2

Impilato , 24 byte

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

Provalo online!

Spiegazione

[:@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

Amico, ho combattuto con il metodo Japt sbagliato per troppo tempo cercando di farlo funzionare per il [1], 3test case in una quantità ragionevole di byte!

VÆëVX x

Provalo


Spiegazione

Input implicito di array Ue numero intero V.

Generare un array di numeri interi da 0a V-1e passare ogni attraverso una funzione con Xessendo l'elemento corrente.

ëVX

Prendi ogni Velemento di U, a partire dall'indice X.

x

Ridurre quella matrice con l'aggiunta.


2

C, (GCC) 101 86 byte

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

uso

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

Si noti che è necessario passare la lunghezza dell'array (s) e un nuovo array dinamico sull'heap (m).



1

PowerShell , 62 byte

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

Provalo online!

Prendiamo input $array e $length. Quindi loop da 1a $l. Ogni iterazione che impostiamo come helper $yè uno in meno del numero corrente (questo perché PowerShell 0-indexes ma $length è in 1-indexing). Quindi impostiamo il nostro $ooutput su 0e eseguiamo nuovamente il loop su $l. Ogni iterazione interiore che stiamo semplicemente accumulando nell'indicizzato in modo $oappropriato$a rray . Ciò sfrutta il fatto che l'indicizzazione oltre la fine dell'array ritorna$null e 0 + $null = 0.

Una volta terminato il ciclo interno, eseguiamo l'output $oe passiamo al blocco successivo. I vari output vengono lasciati sulla pipeline e l'output Write-Outputavviene implicitamente al completamento del programma.


1

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

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

Provalo online!

Modifica: risolto il caso in cui la lunghezza richiesta era inferiore alla matrice di input


1

Buccia , 10 byte

Fż+So:`R0C

Provalo online!

Ungolfed / Spiegazione

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

È leggermente più breve della soluzione Java.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.