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]

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!


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]

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


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`


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]

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]


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.

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

“ 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




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.


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

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

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]




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!


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

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}

0

Clojure, 72 bytes

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

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!


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.

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.