Inspirado por uma pergunta no Stack Overflow .
Dada uma matriz não vazia de números inteiros x
e um número inteiro positivo n
, calcule a soma de cada bloco deslizante de comprimento n
ao longo da matriz x
, preenchendo circularmente os valores ausentes à esquerda com valores da direita da seguinte maneira:
- o primeiro bloco contém a primeira entrada de
x
, precedida porn-1
entradas deslocadas circularmente; - o segundo bloco possui a primeira e a segunda entradas de
x
, precedidas porn-2
entradas deslocadas circularmente; e assim por diante.
A matriz de saída y
tem o mesmo tamanho que x
. É possível n
exceder o comprimento de x
e, em seguida, os valores de x
são circularmente reutilizados várias vezes .
Exemplos
Exemplo 1 (os valores são reutilizados apenas uma vez)
x = [2, 4, -3, 0, -4]
n = 3
dar como saída
y = [-2, 2, 3, 1, -7]
Onde
-2
é a soma do bloco[0, -4, 2]
(os dois primeiros valores vêm do deslocamento circular)2
é a soma de[-4, 2, 4]
(o primeiro valor vem do deslocamento circular)3
é a soma de[2, 4, -3]
(não é mais necessário o deslocamento circular)1
é a soma de[4, -3, 0]
-7
é a soma de[-3, 0, -4]
.
Exemplo 2 (os valores são reutilizados várias vezes)
x = [1, 2]
n = 5
dar
y = [7, 8]
Onde
7
é a soma do bloco[1, 2, 1, 2, 1]
(os quatro primeiros valores foram reutilizados circularmente)8
é a soma do bloco[2, 1, 2, 1, 2]
(os três primeiros valores foram reutilizados circularmente)
Regras adicionais
- O algoritmo deve funcionar para matrizes de tamanho arbitrário e para valores inteiros arbitrários. É aceitável se o programa for limitado por tipo de dados ou restrições de memória; mas valores inteiros positivos e negativos devem ser manipulados.
- A entrada / saída pode ser obtida / produzida por qualquer meio razoável .
- Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas.
- O menor código em bytes vence.
Casos de teste
x, n, -> y
[2, 4, -3, 0, -4], 3 -> [-2, 2, 3, 1, -7]
[1, 2], 5 -> [7, 8]
[2], 7 -> [14]
[-5, 4, 0, 1, 0, -10, -4], 4 -> [-19, -15, -5, 0, 5, -9, -13]
[-5, 4, 0, 1, 0, -10, -4], 1 -> [-5, 4, 0, 1, 0, -10, -4]
[-2, -1, 0, 1, 2, 3], 5 -> [4, 3, 2, 1, 0, 5]
[-10, 0, 10], 4 -> [-10, 0, 10]
code-golf
math
arithmetic
array-manipulation
integer
Luis Mendo
fonte
fonte
Respostas:
Geléia , 5 bytes
Experimente online!
Como funciona
fonte
MATL,
111097 bytes3 bytes salvos graças ao @Luis!
A primeira entrada é o tamanho da janela e a segunda entrada é a matriz
Experimente no MATL Online
Explicação
fonte
Mathematica, 29 bytes
Ou o mesmo comprimento:
fonte
CJam (16 bytes)
Conjunto de testes online . Este é um bloco anônimo (função) que pega a matriz e o comprimento na pilha e deixa uma matriz na pilha.
Dissecação
fonte
Haskell, 57 bytes
Experimente online!
Apenas alguns índices em loop e acessando a lista de entrada em índices modulam o comprimento da lista.
fonte
Haskell ,
696564 bytesExperimente online! Exemplo de utilização:
[2, 4, -3, 0, -4] # 3
.O uso de entradas
n
sucessivas em vez das anteriores pode ser5046 bytes (livrar-se do inverso no início e no final):Experimente online!
fonte
Japonês , 12 bytes
Experimente online!
O TIO não suporta
Ë
, portanto, o link do TIO não funcionará. Em vez disso, tente aqui .fonte
Pitão ,
1816 bytesGuardado 2 bytes graças a @FryAmTheEggman !
Experimente aqui ou verifique todos os casos de teste.
Corrigido todos os defeitos a um custo de -6 bytes ! Muito obrigado ao Luis por me fazer entender a tarefa no chat.
Explicação (a ser atualizada)
fonte
Java 8, 102 bytes
Lambda (ao curry) de
int[]
para lambda deInteger
paraint[]
. Atribuir aFunction<int[], Function<Integer, int[]>>
.Experimente Online
Lambda ungolfed
(j % l + l) % l
calcula um restante não negativo para qualquerj
. Tomado daqui .fonte
C, 91 bytes
Experimente online!
fonte
Oitava, 53 bytes
Experimente online!
imfilter
função com a opçãocircular
calcula a convolução circular no centro da janela para que o resultado seja alterado.fonte
05AB1E , 10 bytes
Experimente online!
Explicação
fonte
Perl 6 ,
4239 bytesExperimente online!
Minha primeira entrada no Perl 6. Provavelmente pode ser melhorado.
fonte
->\a,\b{[«+»] map {a.rotate(-$_)},^b}
Note que isso não acontece neste caso, mas que seria se não havia outra instância$b
no código.Kotlin ,
141140138 bytesApenas uma primeira tentativa
Submissão
Embelezado
TryItOnline
Edições
fonte
Röda , 52 bytes
Experimente online!
Explicação:
fonte
JavaScript ES6
8078 bytes2 bytes salvos graças a Neil
Uso:
fonte
,N
olhares desnecessários para mim ...Perl 5 , 66 + 1 (-a) = 67 bytes
Experimente online!
fonte
Python 2 ,
6961 bytes- 8 bytes Muito obrigado @muru
Experimente online!
Explicação:
Primeiro, precisamos garantir que haja números suficientes no lado esquerdo da lista original, isso é obtido pela
x*n+x
parte.Por exemplo
[2,4,-3,0,4],5
:Então, reverteremos a lista:
Em seguida, obtemos os blocos correspondentes para cada elemento por
[len(x)+~i:][:n]
. A fatia será inversa, ou seja, 2 ganhará um bloco:[2,-4,0,-3,4]
que é o inverso do esperado[4,-3,0,-4,2]
, mas precisamos da soma, afinal. Então, isso funciona. :)fonte
x[-n+1:]+x*n
deve dar-lhe a lista com estofamento suficiente em ambos os lados, sem ter de reverter (lambda x,n:[sum((x[-n+1:]+x*n)[i:i+n])for i in range(len(x))]
)R ,
1019389 bytesExperimente online!
fonte
K (oK) , 18 bytes
Solução:
Experimente online!
Exemplos:
Explicação:
Quando estava prestes a publicar uma solução de 31 bytes , lembrei-me de que o oK tem um built-in para janelas deslizantes ...
Bônus:
A solução de 31 bytes que também funciona no K4 :
fonte