Esse problema é "inspirado" a partir de uma pergunta que foi originalmente feita no Quora (não no código de golfe). Eu só quero fazer disso um desafio para vocês (e meu primeiro problema de envio aqui).
Dada uma matriz de elementos inteiros v
e um número inteiro d
(assumimos que d é menor ou igual ao comprimento da matriz), considere todas as seqüências de d
elementos consecutivos na matriz. Para cada sequência, calcule a diferença entre o valor máximo e mínimo dos elementos nessa sequência e nomeie-o como desvio.
Sua tarefa é escrever um programa ou função que calcule o valor máximo entre todos os desvios de todas as seqüências consideradas acima e retornar ou gerar esse valor.
Exemplo elaborado:
v: (6,9,4,7,4,1)
d: 3
The sequences of length 3 are:
6,9,4 with deviation 5
9,4,7 with deviation 5
4,7,4 with deviation 3
7,4,1 with deviation 6
Thus the maximal deviation is 6, so the output is 6.
Isso é código de golfe, então a resposta mais curta em bytes vence.
fonte
with
em toda uma função lambdaUncaught SyntaxError: Unexpected token with
. Você pode postar um trecho de trabalho?with(Math)
, ou usarf=eval("with(Math)(v,d)=>max(...a)))")
.Python, 60 bytes
Economizando 5 bytes graças a Neil
Minha primeira lambda recursiva!
Uso:
fonte
v and
; o intervalo não aumentará se você remover elementos.Perl, 48 bytes
Inclui +5 para
-0pi
Dê a largura após a
-i
opção, dê os elementos como linhas separadas em STDIN:Apenas o código:
(use um literal
\n
para a pontuação reivindicada)fonte
$&
conterá toda a correspondência que será avaliada como o primeiro número no contexto aritmético.$1
conterá o último número. Então eu falho com força na regex com\A
. Por isso, tentará todas as posições iniciais e comprimentos até a largura. Uso o valor absoluto da diferença como um índice de matriz e vejo o tamanho da matriz. Perl não tem builtinmax
então eu tenho que improvisar-0pi3 -e
em-0pi3e
? Apenas uma suposição sobre uma possível redução, eu não uso perl (portanto, minha pergunta).-i
come tudo depois dele como seu valor, incluindo qualquer ume
-e
tenha que acontecer antes do código? Vadio.R,
636256 bytesBillywob já forneceu uma ótima resposta R usando apenas as funções básicas . No entanto, eu queria ver se uma abordagem alternativa era possível, talvez usando alguns dos extensos pacotes de R. Há uma função interessante
rollapply
nozoo
pacote projetada para aplicar uma função a uma janela rotativa de uma matriz, para que se ajuste bem a nossos propósitos. Usamosrollapply
para encontrar omax
de cada janela e usamos novamente para encontrar omin
de cada janela. Então tomamos a diferença entre os máximos e os minutos, o que nos dá o desvio para cada janela e depois retornamosmax
os valores.fonte
gtools::rolling
, mas esse é mais um byte e eu não estou familiarizado com isso. Estou sempre pensando sobre o uso de pacotes não básicos: por um lado, parece trapaça quando há uma solução simples; por outro lado, os pacotes (e a comunidade) são um dos pontos fortes de R como idioma, eu acho.R,
80bytes de 77 bytesEdit: Salvo 3 bytes graças a @rturnbull
fonte
1:(length(s)-d+1)
pord:sum(1|s)-d+1
.PowerShell v2 +, 68 bytes
Solução iterativa. Loops
$v
, mas na verdade estamos apenas usando isso como um contador, em vez de realmente passar pelos valores. Cada iteração, estamos corte$v
por$i..($i+++$d-1)
, onde$i
o padrão é0
. Nós|sort
esses elementos e armazenamos o resultado$x
. Então pegamos o maior[-1]
e subtraímos o menor[0]
. Nós, então,|sort
obtemos esses resultados e obtemos o maior deles[-1]
. Esse número é deixado no pipeline e a saída é implícita.Exemplos
fonte
05AB1E ,
1210 bytesUsa a codificação CP-1252 .
Experimente online!
Explicação
fonte
Java 8,
140128Raspou um monte, em parte graças ao VTCAKAVSMoACE.
Ungolfed
fonte
int l(int[]a,int d){int x=0,i=0,f,j,k;for(;i<=a.length-d;i++)for(j=i;j<i+d;j++)for(k=j;k<i+d;)x=(f=a[j]-a[k++])<0?-f:f>x?f:x;return x;}
Mathematica,
4137 bytesfonte
{-1,1}
para evitar oAbs
?Max[BlockMap[MinMax,#,#2,1].{-1,1}]&
.Ruby, 45 bytes
Eu sinto que isso poderia ser muito melhor.
fonte
MATLAB com caixas de ferramentas de estatística e processamento de imagens, 33 bytes
Isso define uma função anônima. Exemplo de uso:
Você também pode experimentá-lo no Octave no Ideone (mas o Octave, ao contrário do Matlab, exige o carregamento explícito do pacote de imagens).
Explicação
fonte
Scala, 48 bytes
Ungolfed:
Explicação:
fonte
MATL , 10 bytes
Experimente online!
Explicação
Considere as entradas [6,9,4,7,4,1], 3 como exemplo.
fonte
Na verdade , 13 bytes
Experimente online!
-6 bytes da observação na resposta Haskell de nimi , que fatias menores que
d
não afetam o desvio máximo.Explicação:
fonte
PHP,
8987 bytesNão é particularmente inteligente ou bonito, mas funciona. Use como:
para
v
=6,9,4,7,4,1
,d
=3
Edit: 2 bytes salvos graças a Jörg Hülsermann
fonte
echo+$o;
em vez deecho$o?:0;
CJam , 17 bytes
(Além disso
q~ew:$z)\(\;.-:e>
)Experimente online!
Explicação
fonte
Java 7.159 bytes
Java = caro (eu sei que pode ser jogado muito mais)
Ungolfed
fonte
Haskell, 56 bytes
Exemplo de uso:
3 # [6,9,4,7,4,1]
->6
.Considerando gamas inferiores a
d
não altera o máximo global, para que possamos corrertake d
para baixo até o fim da lista (ou seja, também incluem as faixas com o últimod-1
,d-2
, ...0
elementos). A recursão para com a lista vazia em que definimos o desvio0
.fonte
Java, 126 bytes
Eu me inspirei na resposta do dpa97 e achei o seguinte:
Código expandido, golfe e de exemplo
fonte
Raquete 121 bytes
Ungolfed:
Teste:
Saída:
fonte
q, 25 bytes
mmax
emmin
são a janela deslizante máxima e mínima respectivamenteExemplo
fonte
C #, 131 bytes
aqui está uma solução linq detalhada
fonte
C #, 163 bytes
Golfe:
Ungolfed:
Teste:
Saída:
fonte
Pitão, 11 bytes
Explicação
fonte
Gelatina , 8 bytes
Experimente online!
Usa o mesmo algoritmo que o Dyalog APL, mas percebi isso antes de olhar para ele.
Explicação:
Nota:
x
,y
são deixados, argumentos certos respectivamente.fonte
Perl 6 , 44 bytes
$^a
e$^b
são os dois argumentos para a função, chamadosv
ed
respectivamente na declaração do problema. Orotor
método retorna a sequência de subsequênciasv
de tamanhod
.fonte
Clojure,
7367 bytesEditar: usando em
#(...)
vez de(fn[...])
e emfor
vez demap
.fonte
Python 3, 80 bytes
fonte
(max(v[i:i+d])-min(v[i:i+d])for i in range(-~len(v)-d)
vez demap(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)])