Calcular olas

26

He estado recorriendo este sitio por un tiempo, pero recientemente me interesé realmente en probar algunos de los desafíos. Tenía la intención de probar suerte en algunos de los temas de código de golf existentes, pero ayer no tuve acceso a Internet por un tiempo, y mientras tanto, pensé en mi propio desafío.

Su tarea es crear un programa o función que tome una matriz de Flotadores ay un número entero n, luego establezca cada valor en ael promedio de los dos al lado, nveces. Cuando se usa repetidamente con valores crecientes de n, esto genera un movimiento ondulatorio:

movimiento ondulatorio

Detalles específicos:

  • Si resulta que solo hay un elemento a, o si nes 0 o menos, el programa debe devolver la matriz original.
  • Las entradas y salidas pueden estar en cualquier formato que desee, siempre que estén visiblemente separadas.

Para cada paso:

  • El primer elemento adebe convertirse en el promedio de sí mismo y el siguiente elemento.
  • El último elemento en adebería convertirse en el promedio de sí mismo y el elemento anterior.
  • Cualquier otro elemento en adebería convertirse en el promedio del elemento anterior y el siguiente elemento.
  • ¡Asegúrate de calcular la matriz del paso anterior y no la actual!

Casos de prueba: NOTA: ¡Sus entradas / salidas no tienen que estar en este 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]

Este es el , por lo que la respuesta más corta en bytes gana. El ganador será elegido en una semana (el 1 de agosto). ¡Buena suerte!

Editar: ¡ Felicidades al ganador, @issacg , con la friolera de 18 bytes!

ETHproducciones
fuente
2
Mi consejo para mejorar este desafío es deshacerse de los casos nno suministrados y ano suministrados; realmente no agregan mucho.
isaacg
Creo que el caso de prueba final es incorrecto. ndebería ser 4, no 5.
isaacg
@isaacg: Sí, ahora que lo veo de nuevo, esos casos no parecen tan importantes. Cambié eso y arreglé el ejemplo incorrecto también. ¡Gracias por señalar esas cosas!
ETHproductions
1
Si realmente desea que maneje listas vacías, puede agregarlo a la lista de casos de prueba. Acabo de notar que mi solución falla para ese caso. Personalmente, no soy un gran fanático de los problemas en los que una gran parte de la solución es para manejar casos especiales.
Reto Koradi
@RetoKoradi Lo siento, me había olvidado de eliminar el caso de "lista vacía" de las reglas cuando lo eliminé de los ejemplos. ¡Gracias por la noticia!
ETHproductions

Respuestas:

11

Pyth, 46 18 bytes

ucR2sV+hGGt+GeG.*Q

Este código espera entrada en el formulario iterations, [wave1, wave2, wave3 ...], como se ve en el primer enlace a continuación.

Demostración. Arnés de prueba.

El programa funciona aplicando el código dentro de la función reduce ( u) a la lista de entrada, tantas veces como el número de iteraciones.

Demostraré la función de propagación de ondas en la lista [0, 1, 2, 3, 4, 5], que se encuentra en G:

+hGGantepone Gel primer elemento a G, formando [0, 0, 1, 2, 3, 4, 5].

t+GeGagrega Gel último elemento Gy elimina su primer elemento, formando [1, 2, 3, 4, 5, 5].

sVprimeros forma pares de las listas, dando [[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]con el elemento final de la primera lista truncada. Luego, los pares se suman a través de la sfunción, dando [1, 2, 4, 6, 8, 9].

cR2usos división de coma flotante para dividir todos los números por 2, dando el resultado deseado, [0.5, 1.0, 2.0, 3.0, 4.0, 4.5].

isaacg
fuente
8

Muñeco de nieve 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

Con saltos de línea para "legibilidad":

{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

Versión sin golf / sin minificar:

{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

Ejemplo de formato de E / S:

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]
Pomo de la puerta
fuente
2
Esto es horriblemente hermoso.
kirbyfan64sos
5

Raqueta, 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))))

Sin golf

(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))))

Tenga en cuenta que puede necesitar la #lang racketlínea para ejecutar esto.

Winny
fuente
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)}

Esto crea una función sin nombre que acepta un vector y un entero y devuelve un vector. El enfoque aquí es tratar la entrada como una serie de tiempo univariante y aplicar un filtro de convolución lineal.

Ungolfed + explicación:

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)
}

Ejemplos:

> 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
Alex A.
fuente
4

Haskell, 76 personajes

El truco consiste en agregar el primer número al comienzo de la lista y el último al final de la lista en lugar de tratar con las condiciones 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)

Pruebas:

λ: [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]
Keyran
fuente
1
Puede guardar algunos bytes utilizando operadores infijos para funciones y protectores de 2 argumentos en lugar de if then else, es decir, se cconvierte a#n|n<1=a|1<2=iterate f a!!ny se sconvierte x!y=(x+y)/2(y se llama ...zipWith(!)(x:a)...).
nimi
¡Gracias! No sabía cómo funcionan los guardias en expresiones de una línea.
Keyran
Otros 2 bytes: hacen cun operador infijo, dicen #: a#n|n<1=a|1<2=iterate f a!!n. Llámalo como [0, 0, 1, 0, 0] # 2.
nimi
2

CJam, 23 22 bytes

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

Pruébalo en línea

La entrada está en formato de lista CJam, por ejemplo, para el último ejemplo:

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

La salida también es una lista de CJam:

[33.0 27.0 40.0 22.0 44.0 22.0 40.0 27.0 33.0]

El enfoque básico es que en cada paso, el vector se desplaza una posición hacia la izquierda y una posición hacia la derecha. Cada uno de los dos vectores se rellena con el primer / último elemento, y luego se calcula el promedio de los dos vectores.

Explicación:

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.
Reto Koradi
fuente
No soy el OP, pero "Si sucede que hay cero o un elemento en a, o si n es 0 o menos, el programa debería devolver la matriz original".
Maltysen
2

Java, 181 bytes

Aquí está la versión de golf:

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;}

Sin golf:

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;
}

Traté de acortar las tareas y condicionales tanto como sea posible con Java. Las mejoras son bienvenidas, por supuesto.

JackWhiteIII
fuente
2

JavaScript (ES6), 153 132 67 caracteres

Vuelvo a mi primera respuesta 6 meses después y ¿qué hago? Golf 50% de descuento, eso es lo que. ;)

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 versión se llama a sí misma repetidamente hasta que nsea ​​menor que 1, disminuyendo nen 1 cada vez.

Una solución no 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)")

Sin golf: (anticuado)

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);
}

No 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;
}
ETHproducciones
fuente
if(n<2)return b;return s(b,n-1)podría reducirse areturn n<2?b:s(b,n-1)
Cyoce
@Cyoce Gracias, lo he tenido en cuenta, y algo más ...
ETHproductions
1

Java, 203 bytes

Intentando mi primer puesto con Java. Consejos de mejora son bienvenidos :)

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;}

Bastante impreso:

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;
}
Geir
fuente
Bienvenido a PPCG! No juego mucho en Java, pero ¿puedes mover las tres asignaciones dentro del forbucle externo a la declaración de incremento del bucle? Al igual que for(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;? Entonces deberías poder deshacerte de los frenillos.
Martin Ender
Desafortunadamente, tienen que repetirse en cada iteración, por lo que deben permanecer dentro de las llaves.
Geir
El incremento también se repite en cada iteración, razón por la cual los colocaría en el tercer espacio (separados ++ientre sí y con comas en lugar de punto y coma). Pruébalo. :)
Martin Ender
Veo a dónde vas, pero estoy perdiendo la actualización en la iteración final (a menos que haya un truco que no conozco). Aún así, capaz de reducir algunos bytes aquí y allá haciendo "cosas feas" :)
Geir
No creo que estés perdiendo la actualización en la iteración final. f(a;b;c){d;e;}debe ser completamente idéntico a f{a;b;}{d;e;c;}, y por lo tanto también a f(a;b;e,c)d;. Sin embargo, con su código reorganizado que ya no funciona, porque no puede mover el forinterior del otro for, así que supongo que todo esto ya no importa. ;)
Martin Ender
1

Python 2, 98 bytes

Tomó el enfoque directo, solía execdejar de usar un bucle while. Creo que hay una mejor manera de hacer la lógica para descubrir posiciones de casos especiales, pero esto funciona por ahora. La entrada debe estar formateada 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

Sin golf:

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
Kade
fuente
1

Mathematica, 81 bytes

Tengo la sensación de que podría jugar más golf si pudiera encontrar una mejor manera de manejar la condición de positividad.

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

Vale la pena señalar: Mathematica ofrece muchas soluciones incorporadas potenciales en su rango de funciones de filtro y procesamiento de listas, así como también CellularAutomaton. Elegí Nest[... ListConvolve ...]porque era la forma más fácil de resolver los problemas al final de la lista, pero otros ángulos podrían resultar más cortos.

hYPotenuser
fuente
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

Ejemplos:

>> 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 =
     []
Luis Mendo
fuente
0

Scala, 195 caracteres (186 con salida diferida, es decir 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)}}

Probablemente no sea óptimo, el mapeo sliding(3)es muy útil en este caso.

pruebas:

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)
gilad hoch
fuente
0

q (27 caracteres)

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

Ejemplos

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$()
skeevey
fuente
0

R, 93 bytes

Como una función sin nombre

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
}

Pruebas

> 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
> 
MickyT
fuente
0

Japt, 39 37 bytes (no competitivos)

Esta respuesta no es competitiva porque el lenguaje es más nuevo que el desafío. Solo quería ver qué tan bien mi lenguaje de golf podría resistir mi primer desafío.

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

Pruébalo en línea!

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
ETHproducciones
fuente
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;}

Requiere entrada para ser un contenedor value_type==double, como vector<double>.

Sin golf:

#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;
}
Karl Napf
fuente
0

Raqueta 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]))

Sin golf:

(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]
      )))

Pruebas:

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

Salida:

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