Calculando ondas


26

Estou navegando neste site há um tempo, mas recentemente fiquei realmente interessado em experimentar alguns dos desafios. Eu pretendia tentar alguns dos tópicos existentes sobre golfe com código, mas ontem não tinha acesso à Internet há algum tempo e, nesse meio tempo, pensei em meu próprio desafio.

Sua tarefa é criar um programa ou função que utilize uma matriz de anúmeros flutuantes e um número inteiro e n, em seguida, defina cada valor na amédia dos dois ao lado, nvezes. Quando usado repetidamente com valores crescentes de n, isso gera um movimento semelhante a uma onda:

movimento ondulatório

Específicos:

  • Se houver apenas um item aou se nfor 0 ou menos, o programa retornará a matriz original.
  • As entradas e saídas podem estar no formato que você desejar, desde que elas estejam visivelmente separadas.

Para cada etapa:

  • O primeiro item em adeve se tornar a média de si mesmo e o próximo item.
  • O último item em adeve se tornar a média de si mesmo e o item anterior.
  • Qualquer outro item adeve se tornar a média do item anterior e do próximo item.
  • Certifique-se de calcular a matriz da etapa anterior e não a atual!

Casos de teste: NOTA: Suas entradas / saídas não precisam estar neste formato!

[0, 0, 1, 0, 0], 1          -> [0, 0.5, 0, 0.5, 0]
[0, 0, 1, 0, 0], 2          -> [0.25, 0, 0.5, 0, 0.25]
[0, 0, 1, 0, 0], 0          -> [0, 0, 1, 0, 0]
[0, 0, 1, 0, 0], -39        -> [0, 0, 1, 0, 0]
[0, 16, 32, 16, 0], 1       -> [8, 16, 16, 16, 8]
[0, 1, 2, 3, 4, 5], 1       -> [0.5, 1, 2, 3, 4, 4.5]
[0, 64], 1                  -> [32, 32]
[0], 482                    -> [0]
[32, 32, 32, 16, 64, 16, 32, 32, 32], 4 -> [33, 27, 40, 22, 44, 22, 40, 27, 33]

Isso é , então a resposta mais curta em bytes vence. O vencedor será escolhido em uma semana (em 1º de agosto). Boa sorte!

Edit: Parabéns ao vencedor, @issacg , com incríveis 18 bytes!


2
Meu conselho para melhorar esse desafio é livrar-se dos casos nnão fornecidos e anão fornecidos - eles não acrescentam muito.
Isaacg

Acredito que o caso de teste final esteja incorreto. ndeve ser de 4, não 5.
isaacg

@isaacg: Sim, agora que olho para isso de novo, esses casos não parecem tão importantes. Eu mudei isso e corrigi o exemplo incorreto também. Obrigado por apontar essas coisas!
ETHproductions

1
Se você realmente deseja que ele lide com listas vazias, adicione-o à lista de casos de teste. Acabei de perceber que minha solução falha nesse caso. Pessoalmente, não sou um grande fã de problemas em que grande parte da solução é para lidar com casos especiais.
Reto Koradi

@RetoKoradi Desculpe, esqueci de remover o caso "lista vazia" das regras quando o removi dos exemplos. Obrigado pelo aviso!
ETHproductions

Respostas:


11

Pitão, 46 bytes

ucR2sV+hGGt+GeG.*Q

Esse código espera entrada no formulário iterations, [wave1, wave2, wave3 ...], como visto no primeiro link abaixo.

Demonstração. Equipamento de teste.

O programa funciona aplicando o código dentro da ufunção reduzir ( ) à lista de entrada, quantas vezes o número de iterações.

Vou demonstrar a função de propagação de ondas na lista [0, 1, 2, 3, 4, 5], que está em G:

+hGGprecede Go primeiro elemento de G, formando [0, 0, 1, 2, 3, 4, 5].

t+GeGanexa Go último elemento de Ge remove seu primeiro elemento, formando [1, 2, 3, 4, 5, 5].

sVO primeiro forma pares das listas, fornecendo [[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]o elemento final da primeira lista truncado. Então, os pares são somados via sfunção, dando [1, 2, 4, 6, 8, 9].

cR2usa divisão de ponto flutuante para dividir todos os números por 2, dando o resultado desejado [0.5, 1.0, 2.0, 3.0, 4.0, 4.5],.


8

Boneco de neve 1.0.0 , 219 caracteres

{vg" "aS:10sB;aM0aa,AAg**-:|al|'NdE'0nRal@(%}{->:1*?{0AaG;:?{;bI:dUNiNwR'NdEwRaC;aM(~:?{(()1wR]0wRaC*))#'wRaC|*#|(()#aLNdEdUNdEwR]wR]aCwR*))#aC;:0wRdUaCwR*?{#aC;#bI:*#0aA'|aa|'!*+'(()#1aA*))#|,aa|'*`nA2nD;aM|*0*;bR|tSsP

Com quebras de linha para "legibilidade":

{vg" "aS:10sB;aM0aa,AAg**-:|al|'NdE'0nRal@(%}{->:1*?{0AaG;:?{;bI:dUNiNwR'NdEwRaC;
aM(~:?{(()1wR]0wRaC*))#'wRaC|*#|(()#aLNdEdUNdEwR]wR]aCwR*))#aC;:0wRdUaCwR*?{#aC;#
bI:*#0aA'|aa|'!*+'(()#1aA*))#|,aa|'*`nA2nD;aM|*0*;bR|tSsP

Versão não-golfada / não-minificada:

{vg" "aS:10sB;aM  // input space-separated list of numbers
0aa,AAg           // get first element and array of all-but-first elements
**                // discard original input and the 0

// execute the following (input[0]) times
-:
    |al|'NdE'0nR               // get range from (0..input.length-1]
    al@(%}{->:1*?{0AaG;:?{;bI  // chop off first element if any
    :dUNiNwR'NdEwRaC;aM        // map n -> [n-1 n+1]
    // if the input consisted of a single element, append [0 0]
    // otherwise prepend [0 1] and append [len-2 len-1]
    (~:?{(()1wR]0wRaC*))#'wRaC|*#|(()#aLNdEdUNdEwR]wR]aCwR*))#aC;
        :0wRdUaCwR*?{#aC;#bI
    // map indeces to avg(input[i1], input[i2])
    :*#0aA'|aa|'!*+'(()#1aA*))#|,aa|'*`nA2nD;aM
    // replace old input, reset permavar
    |*0*
;bR

|tSsP  // output result

Formato de E / S de amostra:

llama@llama:...Code/snowman/ppcg53799waves$ snowman waves.snowman 
4 32 32 32 16 64 16 32 32 32
[33 27 40 22 44 22 40 27 33]

2
Isso é horrivelmente bonito.
kirbyfan64sos


5

Raquete, 164 145 bytes

(define(f a n)(if(< n 1)a(f(let([l(length a)][r list-ref])(for/list([i(in-range l)])(/(+(r a(max(- i 1)0))(r a(min(+ i 1)(- l 1))))2)))(- n 1))))

Ungolfed

(define (f a n)
  (if (< n 1)
      a
      (f (let ([l (length a)] [r list-ref])
           (for/list ([i (in-range l)])
             (/ (+ (r a (max (- i 1) 0))
                   (r a (min (+ i 1) (- l 1))))
                2))) (- n 1))))

Observe que você pode precisar da #lang racketlinha para executar isso.


4

R, 109 bytes

function(x,n){l=length(x);t=if(l>2)c(.5,0,.5)else if(l==2)c(.5,.5)else 1;for(i in 1:n)x=filter(x,t,c=T);c(x)}

Isso cria uma função sem nome que aceita um vetor e um número inteiro e retorna um vetor. A abordagem aqui é tratar a entrada como uma série temporal univariada e aplicar um filtro de convolução linear.

Ungolfed + explicação:

f <- function(x, n) {
    # Define filter coefficients
    t <- if (length(x) > 2)
        c(0.5, 0, 0.5)
    else if (length(x) == 2)
        c(0.5, 0.5)
    else
        1

    # Apply the filter n times
    for (i in 1:n) {
        # The circular option wraps the filter around the edges
        # of the series, otherwise the ends would be set to NA.
        x <- filter(x, t, circular = TRUE)
    }

    # Returned the modified input, stripped of the extraneous
    # properties that the filter function adds.
    c(x)
}

Exemplos:

> f(c(32, 32, 32, 16, 64, 16, 32, 32, 32), 4)
[1] 33 27 40 22 44 22 40 27 33

> f(0, 482)
[1] 0

> f(c(0, 64), 1)
[1] 32 32

4

Haskell, 76 caracteres

O truque é adicionar o primeiro número ao início da lista e o último ao final da lista, em vez de lidar com as condições de contorno.

f a@(x:s)=(/2)<$>zipWith(+)(x:a)(s++[last s])
f x=x
a#n|n<1=a|n>0=f a#(n-1)

Testes:

λ: [0, 0, 1, 0, 0]#1  
[0.0,0.5,0.0,0.5,0.0]
λ: [0, 0, 1, 0, 0]#2
[0.25,0.0,0.5,0.0,0.25]
λ: [0, 0, 1, 0, 0]#0  
[0.0,0.0,1.0,0.0,0.0]
λ: [0, 0, 1, 0, 0]#(-39) 
[0.0,0.0,1.0,0.0,0.0]
λ: [0, 16, 32, 16, 0]#1
[8.0,16.0,16.0,16.0,8.0]
λ: [0, 1, 2, 3, 4, 5]#1
[0.5,1.0,2.0,3.0,4.0,4.5]
λ: [0, 64]#1
[32.0,32.0]
λ: [0]#482
[0.0]
λ: [32, 32, 32, 16, 64, 16, 32, 32, 32]#4
[33.0,27.0,40.0,22.0,44.0,22.0,40.0,27.0,33.0]

1
Você pode salvar alguns bytes usando operadores infix para funções e proteções de 2 argumentos em vez de if then else, ou seja, ctorna a#n|n<1=a|1<2=iterate f a!!n- sse e torna - se x!y=(x+y)/2(e é chamado ...zipWith(!)(x:a)...).
nimi

Obrigado! Não sabia como os guardas funcionam em expressões de uma linha.
Keyran

Mais 2 bytes: faça cum operador infix, dizer #: a#n|n<1=a|1<2=iterate f a!!n. Chame assim [0, 0, 1, 0, 0] # 2.
nimi

2

CJam, 23 22 bytes

q~{_(@)@@+@@+.+.5f*}*`

Experimente online

A entrada está no formato de lista CJam, por exemplo, para o último exemplo:

[32 32 32 16 64 16 32 32 32] 4

A saída também é uma lista CJam:

[33.0 27.0 40.0 22.0 44.0 22.0 40.0 27.0 33.0]

A abordagem básica é que, em cada etapa, o vetor é deslocado uma posição para a esquerda e uma posição para a direita. Cada um dos dois vetores é preenchido com o primeiro / último elemento e, em seguida, a média dos dois vetores é calculada.

Explicação:

q~    Get and interpret input.
{     Loop over repeat count.
  _     Copy list.
  (     Pop off left element.
  @     Get original list to top.
  )     Pop off right element.
  @@    Get first element and list with last element removed to top.
  +     Concatenate. This gives right-shifted list with first element repeated.
  @@    Get list with first element removed and last element to top.
  +     Concatenate. This gives left-shifted list with last element repeated.
  .+    Perform vector addition of two shifted lists.
  .5f*  Multiply sum by 0.5 to give average.
}*    End loop over repeat count.
`     Convert result array to string.

Eu não sou o OP, mas "Se houver zero ou um item em a, ou se n for 0 ou menos, o programa deve retornar a matriz original."
Maltysen

2

Java, 181 bytes

Aqui está a versão do golfe:

float[]g(float[]i,int n){float[]c=i.clone();int l=c.length,s=1;if(n>0&&l>1){c[0]=(i[0]+i[1])/2f;c[--l]=(i[l]+i[l-1])/2f;while(s<l)c[s]=(i[s-1]+i[++s])/2f;return g(c,n-1);}return i;}

Ungolfed:

float[] g(float[] i, int n) {
    float[] c = i.clone();
    int l = c.length,s=1;
    if(n>0&&l>1) {
        c[0] = (i[0]+i[1])/2f;
        c[--l] = (i[l]+i[l-1])/2f;
        while(s<l)
            c[s] = (i[s-1] + i[++s]) / 2f;
        return g(c, n-1);
    }
    return i;
}

Tentei reduzir o máximo possível as atribuições e condicionais com o Java. Melhorias são bem-vindas, é claro.


2

JavaScript (ES6), 153 132 67 caracteres

Volto à minha primeira resposta seis meses depois e o que faço? Golf fora de 50%, é isso. ;)

s=(a,n)=>n<1?a:s(a.map((j,i)=>(a[i&&i-1]+a[a[i+1]+1?i+1:i])/2),n-1)

Esta versão se autodefine repetidamente até que nseja menor que 1, diminuindo n1 a cada vez.

Uma solução não recursiva ( 151 130 78 caracteres):

(a,n)=>n<1?a:eval("while(n--)a=a.map((j,i)=>(a[i&&i-1]+a[a[i+1]+1?i+1:i])/2)")

Ungolfed: (desatualizado)

Recursivo:

s = function (a, n) {
  if (n < 1)
    return a;
  b = [];
  l = a.length;
  x = y = 0;
  for(var i = 0; i < l; i++) {
    x = a[(i < 1) ? 0 : i-1];
    y = a[(i > l-2) ? i : i+1];
    b[i] = (x + y)/2;
  }
  if (n > 2)
    return b;
  return s(b,n-1);
}

Não recursivo:

s = function (a, n) {
  if (n < 1)
    return a;
  b = [];
  l = a.length;
  x = y = 0;
  while(n-- > 0) {
    for(var i = 0; i < l; i++) {
      x = a[(i < 1) ? 0 : i-1];
      y = a[(i > l-2) ? i : i+1];
      b[i] = (x + y)/2;
      a = b.slice(0);   // setting a to a copy of b, for copyright reasons
    }
  return b;
}

if(n<2)return b;return s(b,n-1)pode ser reduzido parareturn n<2?b:s(b,n-1)
Cyoce

@Cyoce Obrigado, eu tenho tido isso em conta, e então alguns ...
ETHproductions

1

Java, 203 bytes

Tentando meu primeiro put com Java. Dicas de melhoria são bem-vindas :)

double[]f(double[]a,int n){int j,s,i=0;s=a.length-1;if(n<1||s<1)return a;double b[]=a;for(;i++<n;a=b.clone()){b[0]=.5*(a[0]+a[1]);b[s]=.5*(a[s]+a[s-1]);for(j=1;j<s;++j)b[j]=.5*(a[j-1]+a[j+1]);}return b;}

Bonito impresso:

double[] g(double[] a, int n) {
  int j, s, i = 0;
  s = a.length - 1;
  if (n < 1 || s < 1)
     return a;
  double b[] = a;
  for (; i++ < n; a = b.clone()) {
     b[0] = .5 * (a[0] + a[1]);
     b[s] = .5 * (a[s] + a[s - 1]);
     for (j = 1; j < s; ++j)
        b[j] = .5 * (a[j - 1] + a[j + 1]);
  }
  return b;
}

Bem-vindo ao PPCG! Eu não pratico muito golfe em Java, mas você pode mover as três atribuições dentro do forloop externo para a instrução de incremento do loop? Gosta for(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;? Então você deve conseguir se livrar do aparelho.
Martin Ender

Infelizmente, eles precisam ser repetidos a cada iteração, para que eles fiquem dentro do aparelho.
Geir

O incremento também é repetido a cada iteração, e é por isso que você os coloca no terceiro slot (separado do ++i um do outro por vírgulas em vez de ponto e vírgula). Experimente. :)
Martin Ender

Vejo para onde você está indo, mas estou perdendo a atualização na iteração final (a menos que haja um truque que eu não saiba). Ainda, capaz de raspar alguns bytes aqui e ali, fazendo "coisas feias" :)
Geir

Não acho que você esteja perdendo a atualização na iteração final. f(a;b;c){d;e;}deve ser completamente idêntico aof{a;b;}{d;e;c;} e, portanto, também a f(a;b;e,c)d;. No entanto, com seu código reorganizado que não funciona mais, porque você não pode mover o forinterior para o outro for, acho que tudo isso não importa mais. ;)
Martin Ender

1

Python 2, 98 bytes

Adotou a abordagem direta, usada execpara evitar o uso de um loop while. Eu acho que existe uma maneira melhor de fazer a lógica para descobrir posições de casos especiais, mas isso funciona por enquanto. A entrada deve ser formatada como[list], times .

b,c=input()
k=~-len(b)
exec'b=[(b[x-(0<x<k)]+b[x+(x<k)-(x==k)])/2.for x in range(-~k)];'*c
print b

Ungolfed:

BASE,TIME = input()
TEMP = [0]*len(BASE)                               # Temporary array as to not modify base.
while TIME:
    for x in xrange(len(BASE)):
        if x == 0:                                
            TEMP[x] = (BASE[x]   + BASE[x+1])/2.0  # First element special case.
        elif x == len(BASE)-1:                    
            TEMP[x] = (BASE[x]   + BASE[x-1])/2.0  # Last element special case.
        else:                                     
            TEMP[x] = (BASE[x-1] + BASE[x+1])/2.0  # Every other element.
    BASE = TEMP                                    # Set base to temporary array.
    TEMP = [0]*len(BASE)                           # Reset temporary array to 0s.
    TIME = TIME - 1
print BASE

1

Mathematica, 81 bytes

Tenho a sensação de que poderia jogar mais, se eu descobrisse uma maneira melhor de lidar com a condição de positividade.

f[l_,_]:=l;f[l_,n_/;n>0]:=Nest[.5{1,0,1}~ListConvolve~ArrayPad[#,1,"Fixed"]&,l,n]

Vale ressaltar: o Mathematica oferece várias soluções embutidas em potencial em sua gama de funções de processamento de lista e filtro, além de CellularAutomaton. Eu escolhiNest[... ListConvolve ...] porque era a maneira mais fácil de resolver as distorções no final da lista, mas outros ângulos podem ser mais curtos.


0

Matlab, 109

function a=f(a,n)
if numel(a)>1&n>0
for k=1:n
a=[a(1)+a(2) conv(a,[1 0 1],'valid') a(end-1)+a(end)]/2;end
end

Exemplos:

>> f([0, 0, 1, 0, 0], 1)
ans =
         0    0.5000         0    0.5000         0

>> f([0, 0, 1, 0, 0], 2)
ans =
    0.2500         0    0.5000         0    0.2500

>> f([0, 0, 1, 0, 0], 0)
ans =
     0     0     1     0     0

>> f([0, 0, 1, 0, 0], -39)
ans =
     0     0     1     0     0

>> f([0], 482)
ans =
     0

>> f([], 10)
ans =
     []

0

Scala, 195 caracteres (186 com saída lenta, ie Stream) 187 caracteres

(t:Seq[Float],n:Int)⇒t.size match{case 0|1⇒t;case 2⇒{val a=t.sum/2;Seq(a,a)};case i⇒(t/:(1 to n)){(s,_)⇒(s.take(2).sum/2)+:s.sliding(3).map(l=>(l(0)+l(2))/2).toList:+(s.drop(i-2).sum/2)}}

provavelmente não ideal, mapeamento sliding(3) é muito útil nesse caso.

testes:

scala> (t:Seq[Float],n:Int)⇒t.size match{case 0|1⇒t;case 2⇒{val a=t.sum/2;Seq(a,a)};case i⇒(t/:(1 to n)){(s,_)⇒(s.take(2).sum/2)+:s.sliding(3).map(l=>(l(0)+l(2))/2).toList:+(s.drop(i-2).sum/2)}}
res0: (Seq[Float], Int) => List[Float] = <function2>

scala> res0(Seq(0, 0, 1, 0, 0), 1)
res1: Seq[Float] = List(0.0, 0.5, 0.0, 0.5, 0.0)

scala> res0(Seq(0, 0, 1, 0, 0), 2)
res2: Seq[Float] = List(0.25, 0.0, 0.5, 0.0, 0.25)

scala> res0(Seq(0, 0, 1, 0, 0), 0)
res3: Seq[Float] = List(0.0, 0.0, 1.0, 0.0, 0.0)

scala> res0(Seq(0, 0, 1, 0, 0), -39)
res4: Seq[Float] = List(0.0, 0.0, 1.0, 0.0, 0.0)

scala> res0(Seq(0, 16, 32, 16, 0), 1)
res5: Seq[Float] = List(8.0, 16.0, 16.0, 16.0, 8.0)

scala> res0(Seq(1, 2, 3, 4, 5), 1)
res6: Seq[Float] = List(1.5, 2.0, 3.0, 4.0, 4.5)

scala> res0(Seq(0,64), 1)
res7: Seq[Float] = List(32.0, 32.0)

scala> res0(Seq(0), 482)
res8: Seq[Float] = List(0.0)

scala> res0(Seq(32, 32, 32, 16, 64, 16, 32, 32, 32), 4)
res9: Seq[Float] = List(33.0, 27.0, 40.0, 22.0, 44.0, 22.0, 40.0, 27.0, 33.0)

0

q (27 caracteres)

{avg x^/:1 -1 xprev\:x}/[;]

Exemplos

q)f:{avg x^/:1 -1 xprev\:x}/[;]
q)f[4;32 32 32 16 64 16 32 32 32]
33 27 40 22 44 22 40 27 33f
//1-length input
q)f[10;enlist 1] 
,1f
//0-length input
q)f[10;`float$()]
`float$()

0

R, 93 bytes

Como uma função sem nome

function(a,n){l=length(a);while((n=n-1)>=0)a<-colMeans(rbind(c(a[-1],a[l]),c(a[1],a[-l])));a}

Expandido

function(a,n){
    l=length(a);             # get the length of the vector
    while((n=n-1)>=0)        # repeat n times
        a<-colMeans(         # do the column means and assign to a
          rbind(             # create an array
            c(a[-1],a[l]),   # shift the vector left and duplicate last
            c(a[1],a[-l])    # shift the vector right and duplicate first
          )
        );
    a                        # return the vector
}

Testes

> f=function(a,n){l=length(a);while((n=n-1)>=0)a<-colMeans(rbind(c(a[-1],a[l]),c(a[1],a[-l])));a}
> f(c(0, 0, 1, 0, 0), 1)
[1] 0.0 0.5 0.0 0.5 0.0
> f(c(0, 0, 1, 0, 0), 2)         
[1] 0.25 0.00 0.50 0.00 0.25
> f(c(0, 0, 1, 0, 0), 0)         
[1] 0 0 1 0 0
> f(c(0, 0, 1, 0, 0), -39)        
[1] 0 0 1 0 0
> f(c(0, 16, 32, 16, 0), 1)       
[1]  8 16 16 16  8
> f(c(0, 1, 2, 3, 4, 5), 1)      
[1] 0.5 1.0 2.0 3.0 4.0 4.5
> f(c(0, 64), 1)                  
[1] 32 32
> f(c(0), 482)                    
[1] 0
> f(c(32, 32, 32, 16, 64, 16, 32, 32, 32),4)
[1] 33 27 40 22 44 22 40 27 33
> 

0

Japt, 39 37 bytes (não concorrente)

Essa resposta não é competitiva porque o idioma é mais novo que o desafio. Eu só queria ver o quão bem minha linguagem do golfe poderia aguentar meu primeiro desafio.

Vm0 o r_£ZgY©Y-1 +ZgY>Zl -2?Y:°Y)/2}U

Experimente online!

Vm0 o r_£ZgY©Y-1 +ZgY>Zl -2?Y:°Y)/2}U
Vm0 o      // Generate the range of integers [0, max(V,0)).
r_     }U  // Reduce it with this function, with a starting value of U:
£          //  Return the argument, with each item X, index Y, and the full array Z mapped by this function:
ZgY©Y-1 +  //   Return (Z[max(Y-1,0)] plus
ZgY>Zl -2? //    Z[Y > Z.length-2?
Y:°Y)      //      Y:--Y],)
/2         //   divided by two.
           // Implicit: output last expression

0

C ++ 14, 158 bytes

#define D(a,b)d[i]=(c[a]+c[b])/2;
auto f(auto c,int n){while(n-->0&&c.size()>1){auto d{c};int i{};D(0,1)while(++i<c.size()-1)D(i-1,i+1)D(i,i-1)c=d;}return c;}

Requer entrada para ser um contêiner value_type==double, como vector<double>.

Ungolfed:

#define D(a,b) d[i] = (c[a]+c[b])/2;   //average
auto f(auto c, int n) {
  while(n-- > 0 && c.size() > 1) {     //breaks
    auto d{c};                         //copy container
    int i{};
    D(0,1)                             //left
    while(++i < c.size()-1)            //count up to right
      D(i-1,i+1)                       //interior
    D(i,i-1)                           //right
    c=d;                               //overwrite container
  }
  return c;
}

0

Raquete 223 bytes

(let p((l l)(m 0)(g list-ref))(cond[(> n m)(let*((j(length l))(k(for/list((i j))(cond[(= i 0)(/(+(g l 0)(g l 1))2)]
[(= i(- j 1))(/(+(g l(- j 2))(g l(- j 1)))2)][else(/(+(g l(+ i 1))(g l(- i 1)))2)]))))(p k(+ 1 m) g))][l]))

Ungolfed:

(define(f l n)
  (let loop ((l l)
             (m 0)
             (lr list-ref))
    (cond
      [(> n m)
       (let* ((j (length l))
              (k (for/list ((i j))
                   (cond
                     [(= i 0)       (/ (+ (lr l 0)
                                          (lr l 1))
                                       2)]
                     [(= i (- j 1)) (/ (+ (lr l (- j 2))
                                          (lr l (- j 1)))
                                        2)]
                     [else          (/ (+ (lr l (+ i 1))
                                          (lr l (- i 1)))
                                       2)])
                   )))
         (loop k
               (+ 1 m)
               lr))]
      [else l]
      )))

Teste:

(f '[32 32 32 16 64 16 32 32 32] 4)

Saída:

'(33 27 40 22 44 22 40 27 33)


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.