Adicione uma matriz consigo mesma


22

Hoje, seu desafio é pegar uma matriz, dividi-la em partes e adicioná-las.

Eis como isso funciona: Seu programa ou função receberá uma matriz de números inteiros ae um tamanho de bloco L. A matriz deve ser dividida em matrizes de tamanho L, se o comprimento da matriz não for divisível até Lentão, a matriz deve ter 0's anexados a ela, para que seja igualmente divisível. Depois que a matriz é dividida em partes, todas as partes devem ser adicionadas em elementos. A matriz resultante é então emitida.

Você pode assumir que Lé maior que 0 e que anão é vazio. Você não pode assumir que ao conteúdo é positivo.

Aqui está um exemplo:

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

Casos de teste:

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]

Isso é , o menor número de bytes vence!


Não é um idiota?
sergiol 18/09/17

1
@sergiol Se você puder encontrar uma pergunta que seja uma duplicata, eu mesmo excluirei esta postagem. No entanto, tanto quanto posso dizer, não é um estúpido.
Pavel

Respostas:


10

MATL , 4 bytes

e!Xs

Experimente online!

Primeiro bit do código MATL que escrevi! Recebe duas entradas, acomo um vetor de linha (separado por vírgula) e lcomo um número. Funciona para ser

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



5

Java 7, 86 bytes

Sem dobras ou matrizes sofisticadas, apenas um bom e velho forlaço :)

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

Experimente no Ideone

Forrado:

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 com o bom e velho Java 7 (em vez de 8). ;)
Kevin Cruijssen


5

JavaScript (ES6), 51 bytes

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

Toma de entrada na sintaxe currying: f([1,2])(3).

Casos de teste


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

1
@Oki Dois bytes mais curtos:, a=>n=>a.map((v,i)=>o[i%=n]=~~o[i]+v,o=[])&&omas não adiciona o preenchimento zero necessário.
Justin Mariner

f=deve fazer parte da sua contagem de caracteres.
Nl-x

1
@ nl-x Funções anônimas são permitidas por padrão; portanto, enquanto eu não estiver usando o nome da função no meu código, f=não será necessário. Heres um post na meta sobre isso.
Justin Mariner

1
@ nl-x: Não, não deveria; uma função só precisa ser nomeada se for recursiva (ou, talvez, quine). Caso contrário, uma função anônima é perfeitamente válida. Veja aqui .
Shaggy

5

Mathematica, 27 bytes

O Mathematica quase tinha um builtin para isso

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

Experimente na Wolfram Sandbox

Uso

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

{12, -1, 0, 1}

Explicação

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

Seu link não está funcionando.
Shaggy

1
@ Shaggy, você precisa copiar e colar manualmente o código. O Wolfram Sandbox não suporta entradas pré-preenchidas.
JungHwan Min 19/09/17

4

Mathematica, 58 bytes

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

Entrada

[{1}, 3]

Saída

{1,0,0}


isso funciona para [1], 3 Você pode testá-lo aqui sandbox.open.wolframcloud.com adicionando entrada no final do código e pressionando shift + enter
J42161217

4

Perl 6 , 36 bytes

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

Teste-o

Expandido:

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

Toma lcomo argumento à esquerda e à adireita.

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

Experimente online!

{} Função anônima onde está o argumento da esquerda ( l) e o argumento da direita ( a).

≢⍵ registro (comprimento) de a

⍺÷⍨ dividido por l

 teto (arredondado para cima)

⍺,⍨ acrescentar l

s← armazenar em s(para s hape)

×/ produto disso (ou seja, quantos inteiros são necessários)

⍵↑⍨ pegue muitos números inteiros de a(preenchimento com zeros)

s⍴r eshape para moldar s(linhas, colunas)

+⌿ somas colunares



3

Perl 6 , 40 bytes

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

Experimente online!

Se você gosta do número 42, pode trocar *por um . Isso tornará 42 bytes :—).

Explicação :

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

A mágica por trás do último "complemento" é que o operador é "reduza com zip com +". A propósito, isso seria interrompido se o usássemos apenas em uma lista com uma lista dentro, mas isso nunca acontece se a lista original não estivesse vazia (devido à penúltima linha). Observe também que acabamos pegando não apenas @a, mas @a * $litens. Felizmente, adicionamos apenas zeros que não afetam o resultado final.


3

Casca , 9 bytes

S↑ȯ¡¬Fż+C

Experimente online!

Explicação

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

3

Pitão , 8 bytes

m+F%Q>vz

Experimente aqui!

Pitão , 10 bytes

sMCc.[EZQQ

Experimente aqui!

Explicação

Explicação 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.

Explicação nº 2

sMCc. [EZQQ Programa completo.

    [E Pressione a segunda entrada para a direita, com cópias repetidas de ...
       Z ... Zero (0), até o múltiplo mais próximo de ...
        Q ... A primeira entrada.
   c Q Pique em pedaços de comprimento igual à primeira entrada.
  Transposição da matriz C. Obtenha todas as colunas da lista aninhada.
sM Soma cada.
             Saída (implicitamente). 

Que tal algo como isto:sM.TcEQ
Jakube

@Jakube Isso está incorreto, pois é necessário preencher primeiro com zeros. Essa foi a tentativa inicial de Leaky, mas fracassaria [1], 3, o que daria em [1]vez de [1, 0, 0].
Sr. Xcoder

Desculpe meu erro.
Jakube 18/09/19

3

J , 15 12 bytes

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

Experimente online!

Explicação

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

Algum motivo para não acabarmos com as caixas? Que tal [:+/-@[[\]:?
Jonah

@Jonah Se o tamanho do pedaço for maior que o comprimento da matriz de entrada, ele não será preenchido com zero.
miles

Edição agradável - muito mais limpa agora.
Jonah

3

05AB1E , 8 bytes

ô0ζO²Å0+

Experimente 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 bytes

Å0+¹ô0ζO

Experimente 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

Quase idêntico à minha própria solução: codegolf.stackexchange.com/a/143186/73296
scottinet

@ scottinet Devo ter perdido isso. Eles são bastante diferente que eu vou deixar meu e seu upvote :)
Riley

Eu realmente não me importo, só queria mostrar isso :)
scottinet

@scottinet É interessante que você pode reorganizar as operações e sair com a mesma contagem de bytes e bytes quase idênticos utilizados ( ¹vs ²)
Riley

2

SOGL V0.12 , 14 bytes

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

Experimente aqui! ou Experimente todos os casos de teste. isso é escrito como uma função sem nome e esperachunk length; array na pilha.

Explicação:

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

O que Fhá no código Try it Here que você vinculou?
Pavel

@Pavel o nome das funções. O mesmo que em JS, f=a=>a+2a f=parte não é contada - no SOGL F\nnão é contado.
dzaima 18/09/17

2

05AB1E , 12 bytes

gs÷*+Å0¹+ôøO

Experimente online!

Explicaçã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

Mathematica, 43 bytes

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


2

R , 62 57 bytes

-5 bytes graças a user2390246

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

Experimente online!

Atualizado porque não precisa mais lidar com o caso vazio.

pads acom zeros, constrói uma matriz de llinhas e calcula e retorna as somas da linha.



@ user2390246 é claro! Eu tinha isso em uma versão mais antiga quando tivemos que lidar com o caso vazio, mas este era o meu "principal" e não pensei em tentar isso novamente.
Giuseppe

2

Empilhados , 24 bytes

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

Experimente online!

Explicação

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

Japonês , 7 bytes

Cara, eu lutei com o método Japt errado por muito tempo tentando fazê-lo funcionar no [1], 3caso de teste em uma quantidade razoável de bytes!

VÆëVX x

Tente


Explicação

Entrada implícita de matriz Ue número inteiro V.

Gere uma matriz de números inteiros de 0para V-1e passe cada um deles por uma função Xsendo o elemento atual.

ëVX

Pegue todos os Velementos de U, começando no índice X.

x

Reduza essa matriz por adição.


2

C, (GCC) 101 86 bytes

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

Observe que você precisa passar o comprimento da (s) matriz (s) e uma nova matriz dinâmica na pilha (m).



1

PowerShell , 62 bytes

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

Experimente online!

Tomamos raios de entrada $ae $length. Em seguida, faça um loop de 1para $l. A cada iteração, definimos o auxiliar $ycomo um a menos do que o número atual (isso ocorre porque os índices 0 do PowerShell, mas o $length está na indexação 1). Em seguida, configuramos nossa $osaída 0e retornamos novamente $l. Cada iteração interna que estamos simplesmente acumulando no elemento rray $oindexado adequadamente $a. Isso aproveita o fato de que a indexação após o final da matriz retorna $nulle0 + $null = 0 .

Depois que o loop interno é concluído, produzimos $o e para o próximo bloco. As várias saídas são deixadas no pipeline e a saída via implícita Write-Outputacontece na conclusão do programa.


1

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

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

Experimente online!

Edit: corrigido o caso em que o comprimento solicitado era menor que o array de entrada


1

Casca , 10 bytes

Fż+So:`R0C

Experimente online!

Ungolfed / Explicação

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

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

É um pouco mais curto que a solução Java.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.