Soma de colunas sobre fatias sobrepostas

19

Tarefa

Dada uma lista de números inteiros L e outro número inteiro s , o objetivo é calcular as somas em colunas de todas as fatias de comprimento s (potencialmente sobrepostas) de L , enquanto pertencem a suas posições em relação a L (veja abaixo).

Definições

As fatias de comprimento s (sobrepostas) da lista L são todas as subsequências contíguas (sem quebra) de L que são de comprimento s .

A fim de se referem as posições das fatias s em relação ao L , você pode imaginar a construção de uma "escada", onde cada fatia é i tem um deslocamento de i posiciona desde o início.


Especificações

  • s é um número inteiro maior do que 1 e estritamente menor que o comprimento de L .
  • L sempre conterá pelo menos três elementos.
  • Você pode competir em qualquer linguagem de programação e pode receber e fornecer saída por qualquer método padrão , observando que essas brechas são proibidas por padrão. Isso é , então a submissão mais curta (em bytes) para todos os idiomas vence.

Exemplos e casos de teste

Aqui está um exemplo trabalhado:

[1, 2, 3, 4, 5, 6, 7, 8, 9], 3

[1, 2, 3]
   [2, 3, 4]
      [3, 4, 5]
         [4, 5, 6]
            [5, 6, 7]
               [6, 7, 8]
                  [7, 8, 9]
-------------------------------- (+)  | column-wise summation
[1, 4, 9, 12, 15, 18, 21, 16, 9]

E mais alguns casos de teste:

[1, 3, 12, 100, 23], 4         -> [1, 6, 24, 200, 23]
[3, -6, -9, 19, 2, 0], 2       -> [3, -12, -18, 38, 4, 0]
[5, 6, 7, 8, 2, -4, 7], 3      -> [5, 12, 21, 24, 6, -8, 7]
[1, 2, 3, 4, 5, 6, 7, 8, 9], 3 -> [1, 4, 9, 12, 15, 18, 21, 16, 9]
[1, 1, 1, 1, 1, 1, 1], 6       -> [1, 2, 2, 2, 2, 2, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9], 6 -> [1, 4, 9, 16, 20, 24, 21, 16, 9]
Mr. Xcoder
fonte
2
Esse primeiro caso de teste é irritante. ;) Simplesmente porque sé maior que L/2. Talvez adicione mais alguns casos de teste onde é esse o caso [1, 1, 1, 1, 1, 1, 1], 6 -> [1, 2, 2, 2, 2, 2, 1] `ou [1, 2, 3, 4, 5, 6, 7, 8, 9], 6 -> [1, 4, 9, 16, 20, 24, 21, 16, 9]?
9117 Kevin Cruijssen em 01/02
2
@KevinCruijssen Você pode editar para mim? Esses são alguns bons casos de teste, mas estou no celular agora;) Obrigado!
Sr. Xcoder

Respostas:

11

J , 11, 9 8 bytes

-1 byte graças a milhas!

[:+//.]\

Como funciona?

O argumento da esquerda é s, o da direita - L

]\ - divide L em sublistas com comprimento s

/. - extrai as diagonais oblíquas (anti-diagonais)

+/ - adiciona-os

[: - faz um garfo a partir dos verbos acima

Aqui está um exemplo de sessão J para o primeiro caso de teste:

   a =. 1 2 3 4 5 6 7 8 9

   ] 3 ]\ a 
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9

   ] </. 3 ]\ a 
┌─┬───┬─────┬─────┬─────┬─────┬─────┬───┬─┐
│1│2 2│3 3 3│4 4 4│5 5 5│6 6 6│7 7 7│8 8│9│
└─┴───┴─────┴─────┴─────┴─────┴─────┴───┴─┘

   ] +//. 3 ]\ a 
1 4 9 12 15 18 21 16 9

Experimente online!

Galen Ivanov
fonte
Existe alguma diferença entre uma "diagonal oblíqua" e uma "diagonal"?
Luis Mendo
@Luis Mendo - Eu acho que "oblíquo" significa ir da esquerda para a direita no caso do advérbio J /., em oposição à diagonal principal da esquerda para a direita.
Galen Ivanov
1
Ah obrigada. Então, é isso que é normalmente chamado de anti-diagonais
Luis Mendo
2
Você pode substituir ,/\por]\
miles
@miles Sim, claro! Obrigado!
Galen Ivanov
9

Haskell , 59 56 bytes

s#n=[x*minimum[n,i,length s+1-max i n]|(i,x)<-zip[1..]s]

Experimente online!

Define uma função (#)que recebe uma lista see um número ncomo argumentos.

Isso se baseia na observação de que, por s = [1, 2, 3, 4, 5, 6, 7, 8, 9]en = 3

[1, 2, 3]
   [2, 3, 4]
      [3, 4, 5]
         [4, 5, 6]
            [5, 6, 7]
               [6, 7, 8]
                  [7, 8, 9]
---------------------------- (+)
[1, 4, 9,12,15,18,21,16, 9]

é o mesmo que

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 3, 3, 3, 3, 2, 1]
---------------------------- (*)
[1, 4, 9,12,15,18,21,16, 9]

Para gerar essa lista inicialmente crescente, depois constante e finalmente decrescente, podemos começar com

[minimum[i, length s + 1 - i] | i<-[1..length s]]

qual produz [1, 2, 3, 4, 5, 4, 3, 2, 1]. Adicionar ncomo restrição adicional à minimumexpressão produz a [1, 2, 3, 3, 3, 3, 3, 2, 1]resposta correta da lista para n = 3, embora para n = 6(ou em geral qualquer n > lengths s/2) a restrição adicional length s + 1 - nseja necessária:

[minimum[i, n, length s + 1 - i, length s + 1 - n] | i<-[1..length s]]

ou mais curto:

[minimum[i, n, length s + 1 - max i n] | i<-[1..length s]]

Para a multiplicação por pares, [1..length s]é compactado com zíper e s, como ziptrunca a lista mais longa para o comprimento da menor, a lista infinita [1..]pode ser usada:

[x * minimum[i, n, length s + 1 - max i n] | (i,x)<-zip[1..]s]
Laikoni
fonte
6

JavaScript (ES6), 65 62 58 bytes

Guardado 4 bytes graças a @Shaggy

Recebe entrada na sintaxe de currying (a)(n).

a=>n=>a.map((v,i)=>v*Math.min(++i,n,a.length+1-(n>i?n:i)))

Casos de teste

Arnauld
fonte
Funciona a=>n=>a.map((v,i)=>v*Math.min(++i,n,a.length+1-(n>i?n:i)))para 58 bytes?
Shaggy
@ Shaggy De alguma forma, eu sabia que havia algo realmente estúpido no meu código, mas não conseguia descobrir ... Muito obrigado!
Arnauld
6

Java 8, 83 bytes

L->s->{for(int i=0,l=L.length+1,t,u;++i<l;u=l-(s>i?s:i),L[i-1]*=t<u?t:u)t=i<s?i:s;}

Esse primeiro caso de teste (e os dois últimos que adicionei) me ferrou várias vezes, mas finalmente funciona agora ..: D

Modifica a matriz de entrada em vez de retornar uma nova.

Explicação:

Experimente online.

L->s->{                  // Method with int-array and int parameters, and no return-type
  for(int i=0,           //  Index-integer, starting at 0
      l=L.length+1,      //  The length of the input-array + 1
      t,u;               //  Two temp integers
      ++i<l              //  Loop `i` from 1 to the length (inclusive)
      ;                  //    After every iteration:
       u=l               //     Set temp integer `u` to the length plus 1,
          -(s>i?s:i),    //     minus the highest of `s` and `i`
       L[i-1]*=t<u?t:u)  //     And replace the item with the lowest of `t` and `u`
    t=i<s?i:s;}          //   Set temp integer `t` to the lowest of `i` or `s`
Kevin Cruijssen
fonte
5

MATL , 8 bytes

YCPT&Xds

Experimente online! Ou verifique todos os casos de teste .

Explicação

Considere entradas [1, 3, 12, 100, 23]e 4.

YC     % Implicit inputs: row vector L and number s. Create matrix of 
       % overlapping blocks of L with length s, where each block is a column
       % STACK: [  1   3;
                   3  12;
                  12 100;
                 100  23]
P      % Flip vertically
       % STACK: [100  23;
                  12 100;
                   3  12;
                   1   3]
&TXd   % Extract all diagonals, starting from bottom-left, and arrange them as
       % columns of a matrix, with zero padding
       % STACK: [1   3  12 100   0;
                 0   3  12 100  23]
s      % Sum of each column. Since s is less than the length of L, there are
       % at least two rows. Thus function `s` can be used instead of `Xs`.
       % Implicit display
       % STACK: [1   6  24 200  23]
Luis Mendo
fonte
5

APL (Dyalog Unicode) , 19 14 bytes SBCS

-5 graças a ngn.

Função de infixo tácito anônimo, tomando s como argumento à esquerda e L como argumento à direita. Assume ⎕IO( I ndex O rigin) 0como é o padrão em muitos sistemas.

+⌿∘↑((0,⊢)\,/)

Experimente online!

Explicação com exemplo de caso [1,3,12,100,23]

() Aplique a seguinte função tácita anônima:

,/ janelas sobrepostas desse tamanho; [[1,3,12],[3,12,100],[12,100,23]]

()\ Cumulativamente aplique este tácito a seguinte função tácita anônima:

   o argumento certo (mais)

  0, com um zero à esquerda

A redução cumulativa significa que inserimos a função em todos os "espaços" entre termos sucessivos, trabalhando da direita para a esquerda. Para cada "espaço", a função descartará o argumento esquerdo, mas acrescentará um zero adicional. Efetivamente, isso anexa quantos zeros a cada termo houver "espaços" à esquerda; portanto, o primeiro termo obtém zero espaços, o segundo obtém um e o terceiro obtém dois:[[1,3,12],[0,3,12,100],[0,0,12,100,23]]

 subir a classificação combinando as listas em uma única matriz, preenchendo com zeros;  soma
┌ ┐
│1 3 12 0 0│
│0 3 12 100 0│
│0 0 12 100 23│
└ ┘
 então
+⌿verticalmente;[1,6,36,200,23]

Adão
fonte
1
⊢,⍨¨0⍴⍨¨⍳∘≢->{0,⍵}\
ngn
@ngn Você sempre pensa nessas reduções inteligentes, mas realmente deve publicá-las separadamente. Aliás, acho +⌿∘↑((0,⊢)\,/)mais elegante.
Adám 6/02/2018
oh venha, este é um caso claro de simplificar uma parte de uma solução, não uma ideia nova
NGN
Enquanto isso, resolva esse CMC!
Adám
Não tenho certeza se isso está no tópico nos comentários aqui, mas por que você não usa "each"? 2{(⊃⌽⍺),⊃⍵}/⊢->2{⊃¨(⌽⍺)⍵}/⊢
ngn
4

Gelatina , 6 bytes

JṡṬS×ḷ

Experimente online!

Como funciona

JṡṬS×ḷ  Main link. Left argument: A (array). Right argument: n (integer)

J       Indices; yield [1, ..., len(A)].
 ṡ      Split the indices into overlapping slices of length n.
  Ṭ     Untruth; map each array of indices to a Boolean vector, with 1's at the
        specified indices and 0's elsewhere.
        For example, [3, 4, 5] maps to [0, 0, 1, 1, 1].
   S    Sum the rows, essentially counting how many times each index appears in
        the arrays returned by the ṡ atom.
     ḷ  Left; yield A.
    ×   Multiply the counts to the left with the integers to the right.
Dennis
fonte
3

Japt , 13 bytes

Demorou muito tempo para que isso funcionasse quando s> L/2!

Ë*°EmVUÊÄ-EwV

Tente


Explicação

                 :Implicit input of array U and integer V
Ë                :Map over each element at 0-based index E in U
 *               :  Multiply by
    m            :  The minumum of
  °E             :    E incremented,
     V           :    V,
          EwV    :    and the maximum of E & V
         -       :    subtracted from
      UÊÄ        :    the length of U plus 1
Shaggy
fonte
Demorou muito tempo para fazer isso funcionar quando s > L/2! ” Eu tinha exatamente o mesmo. Os outros casos de teste são fáceis, mas o primeiro (e os dois que adicionei no final) foram irritantes! .. +1 de mim!
Kevin Cruijssen
2

Japonês , 13 12 bytes

-1 byte graças a @ETHproductions

ãV
ËEÆÃcDÃyx

Experimente online!

Oliver
fonte
1

R , 52 51 bytes

function(l,s)l*pmin(s,x<-seq(l),y<-rev(x),y[1]+1-s)

Experimente online!

Isso é equivalente à resposta de Laikoni .

seq(l)produz os índices 1...length(l)desde length(l)>1(caso contrário, produziria 1...l[1]). Salve-o como x, salve seu reverso como ye pegue o primeiro elemento de y(length(l)Salvei ) para portar perfeitamente a resposta de Laikoni e salvar um byte!

Resposta original, 52 bytes

function(l,s,L=sum(l|1)+1)l*pmin(s,x<-2:L-1,L-x,L-s)

Experimente online!

A saída está lelemento a elemento multiplicado pelo mínimo de s, o índice baseia-1 do elemento x, length(l)-x+1e length(L)-s+1.

Isso também é equivalente à resposta de Laikoni, usando em L-xvez de rev(x)ser mais curto.

Giuseppe
fonte
1

APL + WIN, 25 bytes

Solicita a entrada da tela de L seguida por s

+/(1-⍳⍴z)⌽¨(⍴L)↑¨s←⎕,/L←⎕

Explicação:

L←⎕ prompt for screen input of L

s←⎕,/ prompt for screen input of s and create nested vector of successive s elements of L

(⍴L)↑¨ pad each element of the nested vector with zeros to the length of L

(1-⍳⍴z)⌽¨ incrementally rotate each element of the nested vector

+/ sum the elements of the nested vector
Graham
fonte
1

K (oK) , 30 bytes

Solução:

{+/t,'(y':x),'|t:(!1-y-#x)#'0}

Experimente online!

Exemplo:

{+/t,'(y':x),'|t:(!1-y-#x)#'0}[3 -6 -9 19 2 0;2]
3 -12 -18 38 4 0

Explicação:

Não pense que posso competir com J neste caso. Gere uma lista de zeros a serem anexados e anexados à lista da janela deslizante e, em seguida, resuma:

{ t,'(y':x),'|t:(!(#x)+1-y)#'0 }[1 2 3 4 5 6 7 8 9;3]
(1 2 3 0 0 0 0 0 0
 0 2 3 4 0 0 0 0 0
 0 0 3 4 5 0 0 0 0
 0 0 0 4 5 6 0 0 0
 0 0 0 0 5 6 7 0 0
 0 0 0 0 0 6 7 8 0
 0 0 0 0 0 0 7 8 9)

A repartição é a seguinte ... embora isso ainda pareça desajeitado.

{+/t,'(y':x),'|t:(!1-y-#x)#'0} / the solution
{                            } / lambda taking x and y implicitly
                          #'0  / take (#) each (') zero
                 (       )     / do this together
                       #x      / count (#) length of x
                     y-        / take count away from length y
                   1-          / take that result from 1
                  !            / til, generate range to that number
               t:              / save in variable t
              |                / reverse it
            ,'                 / join with each
      (y':x)                   / sliding window size y over x
    ,'                         / join with each
   t                           / prepend t
 +/                            / sum up
rua
fonte
1

Casca , 4 bytes

mΣ∂X

Experimente online!

Usa a ideia de resposta J Galen Ivanov .

Explicação

     -- implicit input number n and list s, e.g. s = [1,2,3,4,5,6] and n = 4 
   X -- get sublists of length n of list s           [[1,2,3,4],[2,3,4,5],[3,4,5,6]]
  ∂  -- anti-diagonals                               [[1],[2,2],[3,3,3],[4,4,4],[5,5],[6]]
mΣ   -- get the sum of each of the lists             [1,4,9,12,10,6]
Laikoni
fonte
0

C (gcc) , 100 bytes

j,x;f(L,l,s)int*L;{for(j=0;j<l;j++)L[j]*=j<s&j<l-s?-~j:j>s&j>l-s?l-j:(x=s<l-j?s:l-j)<l-~-s?x:l-~-s;}

Experimente online!

Jonathan Frech
fonte
0

Python 2 , 68 66 bytes

-2 bytes graças a Laikoni

lambda l,n:[v*min(n,i+1,len(l)-max(i,n-1))for i,v in enumerate(l)]

Experimente online!

ovs
fonte
max(i,n-1)em vez de [i,n-1][n>i].
Laikoni
0

C (gcc) , 83 81 79 bytes

Existem basicamente três "fases" na manipulação da lista: aceleração, sustentação e esfriamento. À medida que avançamos na lista, aumentaremos nosso fator até atingirmos o máximo. Se uma lista completa de fatias puder caber na lista, esse máximo será o mesmo que o comprimento das fatias. Caso contrário, será o mesmo que o número de fatias que se encaixam. No outro extremo, diminuiremos o fator novamente, chegando a 1 no último elemento.

O comprimento das fases de aceleração e resfriamento que marcam esse platô é um a menos que o fator máximo.

Os loops não-golfados antes de combiná-los, esperamos que sejam mais claros (R = duração da fase de aceleração):

for (r = 1; r <= R; r++) L[r - 1] *= r;
for (; r < n - R; r++)   L[r - 1] *= R + 1;
for (; r < n; r++)       L[r - 1] *= n - r + 1;

Três loops são demais, portanto, decidir o fator com base em r nos dá um loop (usando s para R para economizar alguns bytes):

r;f(L,n,s)int*L;{for(r=0,s=2*s-1>n?n-s:s-1;r++<n;)*L++*=r>s?r<n-s?s+1:n-r+1:r;}

Experimente online!

gastropner
fonte
0

Perl, 45 44 bytes

Inclui +4 para -ai Observe também que este código fornece 2 avisos de perl na inicialização. Você pode suprimi-las ao custo de um toque adicionando a Xopção

Forneça o comprimento da máscara após a -iopção e a matriz em uma linha em STDIN:

perl -ai4 -E 'say$_*grep$_~~[$^I..@F],$a..$^I+$a++for@F' <<< "1 3 12 100 23"

Apenas o código:

say$_*grep$_~~[$^I..@F],$a..$^I+$a++for@F
Ton Hospel
fonte
0

Ruby , 62 bytes

->a,l{a.map.with_index{|x,i|x*[i+1,l,a.size-[l-1,i].max].min}}

Experimente online!

Essencialmente, uma porta da resposta javascript de Arnauld , exceto que a necessidade dewith_index é muito mais dolorosa.

No tempo que levou para eu decidir realmente enviar isso, eu joguei essa versão de 70 bytes, que é mais próxima do algoritmo de Dennis .

->a,l{c=a.map{0};(0...a.size).each_cons(l){|h|h.map{|i|c[i]+=a[i]}};c}
benj2240
fonte
0

Clojure, 72 bytes

#(let[R(range 1(inc(count %)))](map *(map min(repeat %2)R(reverse R))%))
NikoNyrh
fonte
0

Pyt , 106 bytes

ĐŁĐ←⇹řĐ↔Đ04ȘĐ04Ș>Đ04Ș03Ș¬*07ȘážÁ*+04Ș⇹Đ3ȘĐ3Ș-⁺Đ4Ș⇹ŕĐ3Ș<Ь3Ș*3Ș*+⇹ĐŁ⑴04Ș3Ș⇹04Ș*Đ04ȘĐ04Ș<Đ04Ș*06ȘážÁ03Ș¬*++*

Pega L na primeira linha como uma matriz e leva s na segunda linha

Explicação:

                     Implicit input (L)
Đ                    Duplicate L
ŁĐ                   Get length of L (len) and push it twice
←                    Get s
⇹ř                   Push [1,2,...,len]
Đ↔Đ                  Push [len,...,2,1] twice
04ȘĐ                 Push 0, flip top 4 on stack, and duplicate top [1,2,...,len]
04Ș>                 Is [len,...,2,1]>[1,2,...,len] (element-wise) [boolean array]
Đ                    Duplicate top of stack                   
04Ș03Ș¬*             Pushes [1,2,...,ceil(len/2),0,...,0]
07ȘážÁ               Push 0, flip top seven on stack, and remove all 0s from stack
*                    Pushes [0,0,...,0,floor(len/2),floor(len/2)-1,...,1]
+                    Adds top two on stack element-wise

The top of the stack is now:
     [1,2,...,ceil(len/2),floor(len/2),...,2,1] (let's call it z)

04Ș                  Push zero and swap top four on stack
⇹                    Swap top two on stack
Đ3ȘĐ3Ș-⁺Đ4Ș⇹ŕĐ3Ș<Ь3Ș*3Ș*+     Pushes min of (len-s+1,s) [let's call it m]
⇹ĐŁ⑴04Ș3Ș⇹04Ș*                Pushes an array [m,m,...,m] with length len
Đ04ȘĐ04Ș<Đ04Ș*06ȘážÁ03Ș¬*++    Pushes element-wise min of [m,m,...,m] and z
*                              Element-wise multiplication of above with L

Experimente online!

mudkip201
fonte
0

Python + numpy, 64 bytes

from pylab import *
lambda l,N:convolve(*ones((2,len(l)-N-1)))*l

Chame isso com l como a lista e N como o comprimento.

user2699
fonte