Calcolo delle onde


26

Sto scorrendo questo sito da un po ', ma di recente mi sono davvero interessato a provare alcune delle sfide. Avevo intenzione di cimentarmi in alcuni degli argomenti di code-golf esistenti, ma ieri non ho avuto accesso a Internet e, nel frattempo, ho pensato alla mia sfida.

Il tuo compito è quello di creare un programma o una funzione che accetta una matrice di float ae un numero intero n, quindi imposta ciascun valore asulla media dei due accanto ad essa, nvolte. Se usato ripetutamente con valori crescenti di n, questo genera un moto ondoso:

moto ondoso

specifiche:

  • Se è presente solo un elemento in a, o se nè 0 o meno, il programma dovrebbe restituire l'array originale.
  • Gli ingressi e le uscite possono essere in qualsiasi formato desiderato, purché siano visibilmente separati.

Per ogni passaggio:

  • Il primo elemento in adovrebbe diventare la media di se stesso e l'elemento successivo.
  • L'ultimo elemento in adovrebbe diventare la media di se stesso e l'elemento precedente.
  • Qualsiasi altro oggetto in adovrebbe diventare la media dell'articolo precedente e dell'articolo successivo.
  • Assicurati di calcolare l'array del passaggio precedente e non quello corrente!

Casi di prova: NOTA: I tuoi ingressi / uscite non devono essere in questo 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]

Questo è , quindi vince la risposta più breve in byte. Il vincitore verrà scelto tra una settimana (il 1 agosto). In bocca al lupo!

Modifica: Congratulazioni al vincitore, @issacg , con ben 18 byte!


2
Il mio consiglio per migliorare questa sfida è di eliminare i casi nnon forniti e anon forniti - in realtà non aggiungono molto.
Isaacg,

Credo che il test finale non sia corretto. ndovrebbe essere 4, non 5.
isaacg

@isaacg: Sì, ora che lo guardo di nuovo, quei casi non sembrano così importanti. L'ho modificato e corretto anche l'esempio errato. Grazie per aver sottolineato quelle cose!
ETHproductions,

1
Se si desidera veramente che gestisca elenchi vuoti, è possibile aggiungerlo all'elenco dei casi di test. Ho appena notato che la mia soluzione fallisce per quel caso. Personalmente, non sono un grande fan dei problemi in cui gran parte della soluzione è per la gestione di casi speciali.
Reto Koradi,

@RetoKoradi Spiacenti, avevo dimenticato di rimuovere il caso "elenco vuoto" dalle regole quando l'ho rimosso dagli esempi. Grazie per l'avviso!
ETHproductions

Risposte:


11

Pyth, 46 18 byte

ucR2sV+hGGt+GeG.*Q

Questo codice prevede input nel modulo iterations, [wave1, wave2, wave3 ...], come si vede al primo link in basso.

Dimostrazione. Collaudare l'imbragatura.

Il programma funziona applicando il codice all'interno della funzione di riduzione ( u) all'elenco di input, tante volte quante sono le iterazioni.

Dimostrerò la funzione di propagazione dell'onda nell'elenco [0, 1, 2, 3, 4, 5], che è in G:

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

t+GeGaggiunge Gl'ultimo elemento Ge rimuove il suo primo elemento, formando [1, 2, 3, 4, 5, 5].

sVprime forme coppie dalle liste, dando [[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]con l'ultimo elemento della prima lista troncato. Quindi, le coppie vengono sommate tramite la sfunzione, dando [1, 2, 4, 6, 8, 9].

cR2Usi galleggianti punto di divisione per dividere tutti i numeri 2, che dà il risultato desiderato, [0.5, 1.0, 2.0, 3.0, 4.0, 4.5].


8

Snowman 1.0.0 , 219 caratteri

{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 interruzioni di riga per "leggibilità":

{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

Versione non modificata / non modificata:

{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

Esempio di formato I / O:

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
Questo è orribilmente bello.
kirbyfan64sos,


5

Racchetta, 164 145 byte

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

Nota, potresti aver bisogno della #lang racketlinea per eseguire questo.


4

R, 109 byte

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

Ciò crea una funzione senza nome che accetta un vettore e un numero intero e restituisce un vettore. L'approccio qui è di trattare l'input come una serie temporale univariata e applicare un filtro di convoluzione lineare.

Ungolfed + spiegazione:

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

Esempi:

> 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 caratteri

Il trucco è aggiungere il primo numero all'inizio dell'elenco e l'ultimo alla fine dell'elenco invece di occuparsi delle condizioni al 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)

test:

λ: [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
È possibile salvare alcuni byte utilizzando operatori infix per funzioni e guard di 2 argomenti invece di if then else, ovvero cdiventa a#n|n<1=a|1<2=iterate f a!!ne sdiventa x!y=(x+y)/2(e viene chiamato ...zipWith(!)(x:a)...).
nimi,

Grazie! Non sapevo come funzionano le guardie nelle espressioni di una riga.
Keyran,

Altre 2 byte: fanno cun operatore infisso, dicono #: a#n|n<1=a|1<2=iterate f a!!n. Chiamalo come [0, 0, 1, 0, 0] # 2.
nimi,

2

CJam, 23 22 byte

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

Provalo online

L'ingresso è in formato elenco CJam, ad esempio per l'ultimo esempio:

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

L'output è anche un elenco CJam:

[33.0 27.0 40.0 22.0 44.0 22.0 40.0 27.0 33.0]

L'approccio di base è che in ogni passaggio, il vettore viene spostato di una posizione a sinistra e di una posizione a destra. Ognuno dei due vettori viene riempito con il primo / ultimo elemento, quindi viene calcolata la media dei due vettori.

Spiegazione:

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.

Non sono l'OP, ma "Se ci sono zero o uno elementi in a, o se n è 0 o meno, il programma dovrebbe restituire l'array originale."
Maltysen,

2

Java, 181 byte

Ecco la versione golfata:

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

Ho cercato di abbreviare il più possibile i compiti e le condizioni con Java. I miglioramenti sono ben accetti, ovviamente.


2

JavaScript (ES6), 153 132 67 caratteri

Torno alla mia prima risposta 6 mesi dopo e cosa devo fare? Golf al 50%, ecco cosa. ;)

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)

Questa versione si chiama ripetutamente fino a quando nè inferiore a 1, diminuendo ndi 1 ogni volta.

Una soluzione non ricorsiva ( 151 130 78 caratteri):

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

Ricorsivo:

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

Non ricorsiva:

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)potrebbe essere ridotto areturn n<2?b:s(b,n-1)
Cyoce l'

@Cyoce Grazie, ne ho tenuto conto e poi alcuni ...
ETHproductions

1

Java, 203 byte

Sto provando il mio primo tentativo con Java. I suggerimenti per il miglioramento sono benvenuti :)

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

Abbastanza stampato:

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

Benvenuti in PPCG! Non gioco molto a golf in Java, ma puoi spostare le tre assegnazioni all'interno del forciclo esterno nell'istruzione di incremento del ciclo? Come for(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;? Quindi dovresti essere in grado di sbarazzarti delle parentesi graffe.
Martin Ender,

Sfortunatamente devono essere ripetuti ad ogni iterazione, quindi devono rimanere all'interno delle parentesi graffe.
Geir,

L'incremento viene ripetuto anche ogni iterazione, motivo per cui li avresti messi nel terzo slot (separati l' ++iuno dall'altro con virgole anziché punti e virgola). Provalo. :)
Martin Ender,

Vedo dove stai andando, ma sto perdendo l'aggiornamento nell'iterazione finale (a meno che non ci sia un trucco che non conosco). Tuttavia, riesco a radere qualche byte qua e là facendo "cose ​​brutte" :)
Geir,

Non credo che stai perdendo l'aggiornamento sull'iterazione finale. f(a;b;c){d;e;}dovrebbe essere completamente identico a f{a;b;}{d;e;c;}, e quindi anche a f(a;b;e,c)d;. Tuttavia, con il tuo codice riorganizzato che non funziona più, perché non puoi spostare l' forinterno dell'altro for, quindi immagino che tutto ciò non abbia più importanza. ;)
Martin Ender il

1

Python 2, 98 byte

Ha preso l'approccio diretto, usato execper uscire dall'uso di un ciclo while. Penso che ci sia un modo migliore di fare la logica per capire le posizioni di casi speciali, ma per ora funziona. L'input deve essere formattato come [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 byte

Ho la sensazione che si potrebbe giocare di più se potessi trovare un modo migliore per gestire la condizione di positività.

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

Vale la pena notare: Mathematica offre molte potenziali soluzioni integrate nella sua gamma di funzioni di elaborazione elenco e filtro, nonché CellularAutomaton. Ho scelto Nest[... ListConvolve ...]perché era il modo più semplice per elaborare i nodi alla fine dell'elenco, ma altri angoli potrebbero dimostrarsi più brevi.


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

Esempi:

>> 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 caratteri (186 con output pigro, ovvero Stream) 187 caratteri

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

probabilmente non ottimale, la mappatura sliding(3)è molto utile in questo caso.

test:

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

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

Esempi

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 byte

Come una funzione senza 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}

allargato

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
}

test

> 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 byte (non concorrenti)

Questa risposta non è competitiva perché la lingua è più recente della sfida. Volevo solo vedere quanto il mio linguaggio golfistico potesse resistere alla mia prima sfida.

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

Provalo 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 byte

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

Richiede input per essere un contenitore value_type==double, come 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

Racchetta 223 byte

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

test:

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

Produzione:

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.